Watch multiple $scope attributes
有没有办法使用
例如。
1 | $scope.$watch('item1, item2', function () { }); |
从AngularJS1.3开始,有一种新的方法叫做
1 2 3 4 5 6 7 8 9 10 11 | $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 }); |
从AngularJS 1.1.4开始,可以使用
1 2 3 4 5 | $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 }); |
这里是抢劫犯的例子
此处为文档
1 2 3 4 5 | $scope.$watch(function watchBothItems() { return itemsCombinedValue(); }, function whenItemsChange() { //stuff }); |
如果您的两个组合值很简单,那么第一个参数通常只是一个角度表达式。例如,firstname和lastname:
1 2 3 | $scope.$watch('firstName + lastName', function() { //stuff }); |
这里有一个与您最初的伪代码非常相似的解决方案,它实际上可以工作:
1 | $scope.$watch('[item1, item2] | json', function () { }); |
编辑:好吧,我觉得这样更好:
1 | $scope.$watch('[item1, item2]', function () { }, true); |
基本上,我们跳过了JSON步骤,这看起来很愚蠢,但是没有它就不能工作。它们是经常被省略的第三个参数,它打开对象相等,而不是引用相等。然后,我们创建的数组对象之间的比较实际上是正确的。
您可以使用$watchgroup中的函数来选择作用域中对象的字段。
1 2 3 4 5 6 7 8 9 | $scope.$watchGroup( [function () { return _this.$scope.ViewModel.Monitor1Scale; }, function () { return _this.$scope.ViewModel.Monitor2Scale; }], function (newVal, oldVal, scope) { if (newVal != oldVal) { _this.updateMonitorScales(); } }); |
为什么不简单地用一个
1 2 3 4 5 | angular.forEach(['a', 'b', 'c'], function (key) { scope.$watch(key, function (v) { changed(); }); }); |
它的开销与为组合值提供函数的开销差不多,实际上不必担心值的组成。
合并值的一个稍安全的解决方案可能是使用以下作为您的
1 | function() { return angular.toJson([item1, item2]) } |
或
1 2 3 4 5 6 7 | $scope.$watch( function() { return angular.toJson([item1, item2]); }, function() { // Stuff to do after either value changes }); |
$watch first参数可以是角度表达式或函数。参见$scope.$watch上的文档。它包含了许多关于$watch方法如何工作的有用信息:何时调用watchExpression,角度如何比较结果等。
1 2 3 | $scope.$watch('age + name', function () { //called when name or age changed }); |
当age和name值都更改时,将调用here函数。
怎么样:
1 2 3 4 5 6 7 8 | scope.$watch(function() { return { a: thing-one, b: thing-two, c: red-fish, d: blue-fish }; }, listener...); |
Angular在1.3版中引入了
1 2 3 4 5 6 | $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]); }); |