Answers:
从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
});
$scope.$watchGroup(['mycustomctrl.foo', 'mycustomctrl.bar'],...
newValues
和oldValues
作为运行一次undefined
,同时分别观察属性是否照常运行。
从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
});
这里的柱塞示例
这里的文件
$watchCollection
旨在将对象传递给对象,并监视对象的任何属性的变化,而$watchGroup
旨在将一系列单个属性传递给观察对象的变化。处理相似但不同的问题略有不同。!
$watch
第一个参数也可以是一个函数。
$scope.$watch(function watchBothItems() {
return itemsCombinedValue();
}, function whenItemsChange() {
//stuff
});
如果您的两个组合值很简单,则第一个参数通常只是一个角度表达式。例如,firstName和lastName:
$scope.$watch('firstName + lastName', function() {
//stuff
});
fullName = firstName + " " + lastName
需要传递一个函数作为第一个参数(而不是像那样的简单表达式'firstName, lastName'
)。Angular如此强大,但是在某些领域中,Angular可以在不损害性能或设计原则的情况下对开发人员更加友好。
$scope.$watch('firstName + lastName', function() {...})
。您也可以只做两块手表:function nameChanged() {}; $scope.$watch('firstName', nameChanged); $scope.$watch('lastName', nameChanged);
。我在答案中添加了简单的案例。
这是一个与您实际工作的原始伪代码非常相似的解决方案:
$scope.$watch('[item1, item2] | json', function () { });
编辑:好的,我认为这更好:
$scope.$watch('[item1, item2]', function () { }, true);
基本上,我们跳过了json步骤,这似乎很愚蠢,但是没有它就无法工作。他们的关键是经常省略的第三个参数,它打开对象相等性,而不是引用相等性。然后,我们创建的数组对象之间的比较实际上可以正常进行。
TypeError: Object #<Object> has no method '$watchCollection'
但是此解决方案可帮助我解决问题!
$scope.$watch('[chaptercontent.Id, anchorid]', function (newValues, oldValues) { ... }, true);
您可以使用$ watchGroup中的函数来选择作用域中对象的字段。
$scope.$watchGroup(
[function () { return _this.$scope.ViewModel.Monitor1Scale; },
function () { return _this.$scope.ViewModel.Monitor2Scale; }],
function (newVal, oldVal, scope)
{
if (newVal != oldVal) {
_this.updateMonitorScales();
}
});
_this
?如果不明确定义范围,范围就不会进入功能吗?
为什么不简单地将其包装成一个forEach
?
angular.forEach(['a', 'b', 'c'], function (key) {
scope.$watch(key, function (v) {
changed();
});
});
这与为合并值提供函数的开销大致相同, 而实际上不必担心值的组成。
changed()
每当这两个属性中的任何更改时,都会调用。这与提供组合值的函数的行为完全相同。
$ watch第一个参数可以是角度表达式或函数。请参阅$ scope。$ watch上的文档。它包含有关$ watch方法如何工作的许多有用信息:调用watchExpression时,角度如何比较结果等。
怎么样:
scope.$watch(function() {
return {
a: thing-one,
b: thing-two,
c: red-fish,
d: blue-fish
};
}, listener...);
true
参数to scope.$watch
(如您的示例),listener()
则会每次触发一次,因为匿名哈希每次都具有不同的引用。
return { a: functionA(), b: functionB(), ... }
。然后,我彼此检查返回的新值和旧值的对象。
$scope.$watch('age + name', function () {
//called when name or age changed
});
当年龄和名字值都改变时,这里的函数将被调用。
$watchGroup
在1.3版中引入的Angular 使用它可以监视多个变量,单个$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]);
});