关于javascript:观察多个$ scope属性

Watch multiple $scope attributes

有没有办法使用$watch订阅多个对象上的事件?

例如。

1
$scope.$watch('item1, item2', function () { });

从AngularJS1.3开始,有一种新的方法叫做$watchGroup,用于观察一组表达式。

1
2
3
4
5
6
7
8
9
10
11
$scope.foo = 'foo';
$scope.bar = 'bar';

$scope.$watchGroup(['foo', 'bar'], function(newValues, oldValues, scope) {
  // newValues array contains the current values of the watch expressions
  // with the indexes matching those of the watchExpression array
  // i.e.
  // newValues[0] -> $scope.foo
  // and
  // newValues[1] -> $scope.bar
});


从AngularJS 1.1.4开始,可以使用$watchCollection

1
2
3
4
5
$scope.$watchCollection('[item1, item2]', function(newValues, oldValues){
    // do stuff here
    // newValues and oldValues contain the new and respectively old value
    // of the observed collection array
});

这里是抢劫犯的例子

此处为文档


$watch第一个参数也可以是函数。

1
2
3
4
5
$scope.$watch(function watchBothItems() {
  return itemsCombinedValue();
}, function whenItemsChange() {
  //stuff
});

如果您的两个组合值很简单,那么第一个参数通常只是一个角度表达式。例如,firstname和lastname:

1
2
3
$scope.$watch('firstName + lastName', function() {
  //stuff
});


这里有一个与您最初的伪代码非常相似的解决方案,它实际上可以工作:

1
$scope.$watch('[item1, item2] | json', function () { });

编辑:好吧,我觉得这样更好:

1
$scope.$watch('[item1, item2]', function () { }, true);

基本上,我们跳过了JSON步骤,这看起来很愚蠢,但是没有它就不能工作。它们是经常被省略的第三个参数,它打开对象相等,而不是引用相等。然后,我们创建的数组对象之间的比较实际上是正确的。