观察变量并改变它

Posted

技术标签:

【中文标题】观察变量并改变它【英文标题】:Watch variable and change it 【发布时间】:2014-10-08 23:23:06 【问题描述】:

在 AngularJS 中,我有一个监视范围变量的指令。当变量包含某些数据时,我需要稍微更改该变量。问题是当我更改变量时,我的$watch 再次被触发。所以我最终陷入了一个连续的循环。

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

这会再次触发$watch,这是有道理的。但我确实需要一种方法来更改监视变量。有没有办法做到这一点?

【问题讨论】:

使用另一个布尔值管理它 【参考方案1】:

这就是脏检查的工作原理。每次$scope 上的某些内容发生更改时,Angular 都会遍历范围内的所有内容,并且会一直这样做,直到没有更多更改为止。

如果你想做这样的事情,你必须确保你的$watch 函数是幂等的。您必须同时查看 newValueoldValue 并确定您是否已经在此 $digest 循环中将更改应用于变量。如何做到这一点取决于您对someVar 所做的更改。

一般来说,不幸的是,在监视函数中更改监视变量不是一个好主意。

【讨论】:

【参考方案2】:

是的,你可以像这样取消它

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

);
wathcer(); // clear the watch

【讨论】:

【参考方案3】:

函数内部使用 if 条件来避免继续循环

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

【讨论】:

【参考方案4】:

你可以使用 bool 变量来管理它

$scope.someVarChanged = false;

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

【讨论】:

【参考方案5】:

当使用$scope.$watch 监视变量的更改时,角度检查引用是否已更改。如果有,则执行$watch 处理程序以更新视图。

如果您计划在 $watch 处理程序中更改范围变量,它将触发无限的 $digest 循环,因为每次调用范围变量引用都会更改。

解决无限摘要问题的技巧是使用 angular.copy (@ 987654321@):

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);

);

注意:此技巧仅适用于对象引用。它不适用于基元。

一般来说,在自己的$watch 侦听器中更新$watched 变量不是一个好主意。但是,有时它可能是不可避免的。

【讨论】:

以上是关于观察变量并改变它的主要内容,如果未能解决你的问题,请参考以下文章

使用 Vuex 在 Vue.js 中的计算属性上未从观察者更新数据变量

告诉我你的身份证(E)!

观察绑定或状态变量

如何从另一个变量或 Observable 观察一个变量?

在调试期间观察 SSIS 中的变量

基于设备旋转更新变量 - Swift UI