有没有办法使用$watch
E.g。
$scope.$watch('item1, item2', function () { });
答案 0 :(得分:570)
从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
});
答案 1 :(得分:290)
从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示例here
文档here
答案 2 :(得分:118)
$watch
第一个参数也可以是一个函数。
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
如果您的两个组合值很简单,则第一个参数通常只是一个角度表达式。例如,firstName和lastName:
$scope.$watch('firstName + lastName', function() {
//stuff
});
答案 3 :(得分:70)
这是一个非常类似于原始伪代码的解决方案:
$scope.$watch('[item1, item2] | json', function () { });
编辑:好的,我认为这更好:
$scope.$watch('[item1, item2]', function () { }, true);
基本上我们正在跳过json步骤,这一步似乎开始时是愚蠢的,但没有它就无法工作。它们的关键是经常省略的第3个参数,它打开对象相等而不是引用相等。然后我们创建的数组对象之间的比较实际上是正确的。
答案 4 :(得分:15)
您可以使用$ watchGroup中的函数来选择范围内对象的字段。
$scope.$watchGroup(
[function () { return _this.$scope.ViewModel.Monitor1Scale; },
function () { return _this.$scope.ViewModel.Monitor2Scale; }],
function (newVal, oldVal, scope)
{
if (newVal != oldVal) {
_this.updateMonitorScales();
}
});
答案 5 :(得分:12)
为什么不把它简单地包裹在forEach
?
angular.forEach(['a', 'b', 'c'], function (key) {
scope.$watch(key, function (v) {
changed();
});
});
与为组合值提供函数的开销大致相同,实际上不必担心值组合。
答案 6 :(得分:11)
组合值的更安全的解决方案可能是使用以下作为$watch
函数:
function() { return angular.toJson([item1, item2]) }
或
$scope.$watch(
function() {
return angular.toJson([item1, item2]);
},
function() {
// Stuff to do after either value changes
});
答案 7 :(得分:5)
$ watch第一个参数可以是angular expression或函数。请参阅$scope.$watch上的文档。它包含许多关于$ watch方法如何工作的有用信息:调用watchExpression时,角度如何比较结果等。
答案 8 :(得分:4)
怎么样:
scope.$watch(function() {
return {
a: thing-one,
b: thing-two,
c: red-fish,
d: blue-fish
};
}, listener...);
答案 9 :(得分:4)
$scope.$watch('age + name', function () {
//called when name or age changed
});
当年龄和名称值都发生变化时,将调用函数。
答案 10 :(得分:1)
Angular在版本1.3中引入了$watchGroup
,使用它可以看到多个变量,只有一个$watchGroup
块
$watchGroup
将数组作为第一个参数,我们可以在其中包含要监视的所有变量。
$scope.$watchGroup(['var1','var2'],function(newVals,oldVals){
console.log("new value of var1 = " newVals[0]);
console.log("new value of var2 = " newVals[1]);
console.log("old value of var1 = " oldVals[0]);
console.log("old value of var2 = " oldVals[1]);
});