angularjs $ watch旧值和新值是一样的

时间:2013-12-23 22:13:35

标签: angularjs

我的目的是在范围内观察模型,找出旧值和新值之间的差异。

但是,我发现以下代码中的旧值和新值都是相同的。

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

4 个答案:

答案 0 :(得分:35)

您可以使用$watch代替,这似乎有效。如果您想要观察对象上的所有属性(正如您所做的那样),则需要将true作为第三个参数添加到手表中。这引起了深刻的关注。

Here is a working plunker.

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);
});

答案 1 :(得分:12)

我发现检查新旧值是否相等(在值中)是非常有用的,并且如果出现这种情况则跳过该过程以避免意外行为。您可以使用angular.equals来实现这一目标。这是一个例子:

JS:

$scope.$watch('myObject', function(newValue, oldValue){
    if(angular.equals(newValue, oldValue)){
        return; // simply skip that
    }
});

答案 2 :(得分:5)

这是一个错误。

https://github.com/angular/angular.js/issues/2621

似乎没有修复。

答案 3 :(得分:2)

值作为参数传递

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