是否有一种方法可以使用$watch订阅多个对象上的事件

E.g.

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

当前回答

$scope.$watch('age + name', function () {
  //called when name or age changed
});

在这里,当年龄和名称值都被改变时,函数将被调用。

其他回答

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

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

这里是Plunker的例子

文件在这里

从AngularJS 1.3开始,有了一个名为$watchGroup的新方法,用于观察一组表达式。

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

一个稍微安全一点的组合值的解决方案可能是使用下面的$watch函数:

function() { return angular.toJson([item1, item2]) }

or

$scope.$watch(
  function() {
    return angular.toJson([item1, item2]);
  },
  function() {
    // Stuff to do after either value changes
  });
$scope.$watch('age + name', function () {
  //called when name or age changed
});

在这里,当年龄和名称值都被改变时,函数将被调用。

这里有一个解决方案非常类似于你原来的伪代码,实际上是有效的:

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

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

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

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