Подтвердить что ты не робот

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

4b9b3361

Ответ 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
    }
});

Ответ 4

Значения передаются как параметры

$scope.$watch('foo', function (newValue, oldValue) {
  // ...
}