一尘不染

观看变量并进行更改

angularjs

在AngularJS中,我有一个指令来监视作用域变量。当变量包含某些数据时,我需要对该变量进行一些更改。问题是,当我更改变量时,$watch将再次触发我。所以我最终陷入了持续的循环。

scope.$watch('someVar', function(newValue, oldValue) {
    console.log(newValue);
    scope.someVar = [Do something with someVar];
});

这会继续触发$watch,这很有意义。但是我确实需要一种更改监视变量的方法。有没有办法做到这一点?


阅读 171

收藏
2020-07-04

共1个答案

一尘不染

当使用监视变量的变化时$scope.$watch,角度检查参考值是否已更改。如果具有,则$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侦听器中更新变量不是一个好主意。但是,有时这是不可避免的。

2020-07-04