2015-05-27 2 views
4

Может кто-нибудь объяснить, почему вход с ng-моделью в этой панели не обновляется при нажатии кнопки?Дата объекта в Angular

http://plnkr.co/edit/8JpyUVM8dY8aoV4fi5hC?p=preview

HTML

<body ng-controller="MainCtrl"> 
    Using ng-model: <input type="text" ng-model="myDate"><br/> 
    Using expression: {{ myDate }}<br/> 
    <button ng-click="nextDay()">Next Day</button> 
    </body> 

JS

app.controller('MainCtrl', function($scope) { 
    $scope.myDate = new Date(); 
    $scope.nextDay = function(){ 
    $scope.myDate.setDate($scope.myDate.getDate() + 1); 
    }; 
}); 

ответ

2

Рабочая Plunker: http://plnkr.co/edit/ku8iy0YKvQfBdolg7cug?p=preview

Изменить ваш контроллер:

var app = angular.module('plunker', []); 

app.controller('MainCtrl', function($scope) { 
    $scope.myDate = new Date(); 
    $scope.nextDay = function(){ 
    var newDate = new Date($scope.myDate.setDate($scope.myDate.getDate() + 1)); 
    $scope.myDate = newDate; 
    }; 
}); 

Как другие упоминали, ссылка на экземпляр не изменился, поэтому Угловая не знает, что нужно, чтобы сделать это снова. Изменяя объект Date полностью, вы вынуждаете Angular отображать измененную модель.

0

Вместо обновления даты с помощью метода SETDATE, установите новое значение объекта $ scope.myDate с локально создано версию обновленной даты.

$scope.myDate.setDate($scope.myDate.getDate() + 1); 

становится

var newDate = new Date(); 
newDate.setDate($scope.myDate.getDate() + 1); 
$scope.myDate = newDate; 
0

Поскольку вход принимает строку, ToString() является implicly названием на MyDate. ли это вместо:

var app = angular.module('plunker', []); 

app.controller('MainCtrl', function($scope) { 
    $scope.myDate = new Date(); 
    $scope.myDateStr = $scope.myDate.toString(); 
    $scope.nextDay = function(){ 
    $scope.myDate.setDate($scope.myDate.getDate() + 1); 
    $scope.myDateStr = $scope.myDate.toString(); 
    }; 
}); 

В вашем HTML:

<input type="text" ng-model="myDateStr"> 
-2

реальный ответ вы можете найти here. Вы не можете использовать ng-model с <input/>. На курсе вы можете найти множество альтернатив, таких как привязка с {{}}.

@Marc На самом деле ng-bind связывает текстовое содержимое элемента, а не его значение. Из-за этого он не может использоваться в элементах

0

Итак, что происходит, так это то, что angularjs поддерживает контрольные часы объекта даты, который вы задали первоначально. Использование метода setDate не изменяет ссылку, поэтому угловой не знает, что она изменилась.

Вот почему:

var newDate = new Date(); 
newDate.setDate($scope.myDate.getDate() + 1); 
$scope.myDate = newDate; 

Works.

Смежные вопросы