在AngularJS中,我有一个指令来监视作用域变量。当变量包含某些数据时,我需要对该变量进行一些更改。问题是,当我更改变量时,$watch将再次触发我。所以我最终陷入了持续的循环。
$watch
scope.$watch('someVar', function(newValue, oldValue) { console.log(newValue); scope.someVar = [Do something with someVar]; });
这会继续触发$watch,这很有意义。但是我确实需要一种更改监视变量的方法。有没有办法做到这一点?
当使用监视变量的变化时$scope.$watch,角度检查参考值是否已更改。如果具有,则$watch执行处理程序以更新视图。
$scope.$watch
如果您打算在$ watch处理程序中更改范围变量,它将触发一个无限的$ digest循环,因为范围变量引用在每次调用时都会更改。
解决无限摘要问题的技巧是使用 angular.copy (docs)在处理程序中 保留 引用:$watch __
scope.$watch('someVar', function(newValue, oldValue) { console.log(newValue); var someVar = [Do something with someVar]; // angular copy will preserve the reference of $scope.someVar // so it will not trigger another digest angular.copy(someVar, $scope.someVar); });
注意:此技巧仅适用于对象引用。它不适用于原语。
通常,$watched在其自己的$watch侦听器中更新变量不是一个好主意。但是,有时这是不可避免的。
$watched