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

E.g.

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

当前回答

$watch的第一个参数可以是角表达式或函数。请参阅有关$scope.$watch的文档。它包含了很多关于$watch方法如何工作的有用信息:何时调用watchExpression, angular如何比较结果等。

其他回答

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

您可以使用$watchGroup中的函数来选择范围内对象的字段。

        $scope.$watchGroup(
        [function () { return _this.$scope.ViewModel.Monitor1Scale; },   
         function () { return _this.$scope.ViewModel.Monitor2Scale; }],  
         function (newVal, oldVal, scope) 
         {
             if (newVal != oldVal) {
                 _this.updateMonitorScales();
             }
         });
$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的例子

文件在这里