在AngularJS中,我有一个监视作用域变量的指令。当变量包含某些数据时,我需要稍微修改该变量。问题是,当我更改变量时,我的$watch再次被触发。所以我最终成了一个连续的循环。
scope.$watch('someVar', function(newValue, oldValue) {
console.log(newValue);
scope.someVar = [Do something with someVar];
});这再次触发$watch,这是有道理的。但我确实需要一种改变观察变量的方法。有办法这样做吗?
发布于 2014-08-15 07:58:08
当使用$scope.$watch监视变量的变化时,角度检查引用是否已更改。如果有,则执行$watch处理程序来更新视图。
如果计划在$watch处理程序中更改范围变量,它将触发无限$digest循环,因为范围变量引用每次调用时都会更改。
绕过无限摘要问题的诀窍是使用(文档)保存$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变量不是一个好主意。然而,有时这可能是不可避免的。
发布于 2014-08-15 07:45:11
函数内部使用如果条件可以避免连续的循环
scope.$watch('someVar', function(newValue, oldValue) {
if(newValue!==oldValue) {
console.log(newValue);
scope.someVar = [Do something with someVar];
}
});发布于 2014-08-15 07:41:55
这就是肮脏检查的工作原理。每当$scope上的某物发生变化时,角度就会通过附加到范围的所有东西来旋转,并且它会一直这样做,直到没有更多的变化。
如果您想这样做,您必须确保您的$watch函数是幂等的。您必须同时查看newValue和oldValue,并确定您是否已经在这个$digest循环中将这些更改应用于您的变量。如何做到这一点在一定程度上取决于您对someVar所做的更改。
一般来说,在手表函数中改变一个观察变量并不是一个好主意.
https://stackoverflow.com/questions/25322780
复制相似问题