是否有一种方法可以使用$watch订阅多个对象上的事件
E.g.
$scope.$watch('item1, item2', function () { });
是否有一种方法可以使用$watch订阅多个对象上的事件
E.g.
$scope.$watch('item1, item2', function () { });
当前回答
您可以使用$watchGroup中的函数来选择范围内对象的字段。
$scope.$watchGroup(
[function () { return _this.$scope.ViewModel.Monitor1Scale; },
function () { return _this.$scope.ViewModel.Monitor2Scale; }],
function (newVal, oldVal, scope)
{
if (newVal != oldVal) {
_this.updateMonitorScales();
}
});
其他回答
$watch的第一个参数也可以是一个函数。
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
如果你的两个组合值很简单,第一个参数通常只是一个角度表达式。例如,firstName和lastName:
$scope.$watch('firstName + lastName', function() {
//stuff
});
$watch的第一个参数可以是角表达式或函数。请参阅有关$scope.$watch的文档。它包含了很多关于$watch方法如何工作的有用信息:何时调用watchExpression, angular如何比较结果等。
一个稍微安全一点的组合值的解决方案可能是使用下面的$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(function() {
return {
a: thing-one,
b: thing-two,
c: red-fish,
d: blue-fish
};
}, listener...);
这里有一个解决方案非常类似于你原来的伪代码,实际上是有效的:
$scope.$watch('[item1, item2] | json', function () { });
编辑:好吧,我觉得这个更好:
$scope.$watch('[item1, item2]', function () { }, true);
基本上,我们跳过了json步骤,这一开始看起来很愚蠢,但没有它就无法工作。关键是经常被忽略的第三个参数,它开启对象相等而不是引用相等。然后,我们创建的数组对象之间的比较实际上是正确的。