Angularjs $watch старое значение и новое значение одинаковы
Мое намерение - посмотреть модель в пределах области действия и найти разницу между старым значением и новым значением.
Тем не менее, я нашел старое значение, а новое значение все равно из следующего кода.
app.controller('MyCtrl', function($scope, $timeout){
$scope.markers = {};
$scope.$watchCollection('markers', function(newValue, oldValue){
console.log('being watched oldValue:', oldValue, 'newValue:', newValue);
});
$timeout( function() {
$scope.markers.foo = 1;
}, 500);
$timeout( function() {
$scope.markers.bar = 2;
}, 500);
});
выход:
being watched oldValue: Object {} newValue: Object {} script.js:6
being watched oldValue: Object {foo: 1} newValue: Object {foo: 1} script.js:6
being watched oldValue: Object {foo: 1, bar: 2} newValue: Object {foo: 1, bar: 2}
Почему они одинаковы, и если это преднамеренно, то почему?
вот код, http://plnkr.co/edit/rfMCF4x6CmVVT957DPSS?p=preview
Ответы
Ответ 1
Вместо этого вы можете использовать $watch
, что похоже на работу. Если вы хотите также просмотреть все объекты на объекте (как вы это делаете), вам нужно добавить true
в качестве третьего параметра к часам. Это создает глубокие часы.
Вот рабочий плункер.
JS:
app = angular.module('myApp',[]);
app.controller('MyCtrl', function($scope, $timeout){
$scope.markers = {};
$scope.$watch('markers', function(newValue, oldValue){
console.log('being watched oldValue:', oldValue, 'newValue:', newValue);
}, true);
$timeout( function() {
$scope.markers.foo = 1;
}, 500);
$timeout( function() {
$scope.markers.bar = 2;
}, 500);
});
Ответ 2
Я обнаружил, что очень полезно проверить, являются ли новые и старые значения равными (в значениях) и пропустить процесс, если это случай, чтобы избежать неожиданного поведения. Вы можете использовать angular.equals для достижения этого. Вот пример:
JS:
$scope.$watch('myObject', function(newValue, oldValue){
if(angular.equals(newValue, oldValue)){
return; // simply skip that
}
});
Ответ 3
Это ошибка.
https://github.com/angular/angular.js/issues/2621
и кажется, что он не исправлен.
Ответ 4
Значения передаются как параметры
$scope.$watch('foo', function (newValue, oldValue) {
// ...
}