AngularJS:清除 $watch

IT技术 javascript angularjs watch
2021-02-21 23:34:13

我的 AngularJS 应用程序中有一个监视功能。

$scope.$watch('quartzCrystal', function () {
   ...
}

但是,在某些情况下(在我的示例中,在我的单页应用程序中更改页面)我想停止该监视(例如清除超时)。

我怎样才能做到这一点?

6个回答

$watch返回一个注销函数。调用它会注销$watcher.

var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch
但是,如果我只想要观察者检查值是否存在,然后当它存在时做一些更改,然后自行注销我已经尝试过 - var listen = $scope.$watch('mvIdentity.currentUser', function(currentUser ) { test = 1; console.log("--> " + $scope.updateemail + " -- " + test); listen(); });
2021-04-20 23:34:13
@UmurKontacı 实际上,死者的评论是完全有效的,因为您的原始评论并非对每种情况都正确。
2021-05-06 23:34:13
当作用域被销毁时,所有观察者都将被删除,你不需要管理它们
2021-05-08 23:34:13
您知道在控制器生命周期结束时(例如在 a 上$on('$destroy')取消注册所有侦听器是否是一个好习惯,或者 AngularJS 会处理它们吗?谢谢!
2021-05-15 23:34:13
你可以在这里看到一个有趣的讨论来解释这个问题:github.com/angular/angular.js/issues/4574基本上,如果你为 $rootScope 分配一个监听器,你必须自己取消分配,否则它会一直存在$scope 变化。$scope 上的观察者会被 $scope 销毁($scope 不是 Angular 中的单例,它们会在需要时被创建和销毁)。
2021-05-15 23:34:13

scope.$watch 返回一个您可以调用的函数,该函数将取消注册手表。

就像是:

var unbindWatch = $scope.$watch("myvariable", function() {
    //...
});

setTimeout(function() {
    unbindWatch();
}, 1000);
是的,您可以在 watchFn 中解除绑定!简单用例:您只想观看并执行 watchFn 一次,然后停止观看。
2021-04-26 23:34:13
调用解除绑定函数后,我可以重新绑定手表吗,就像再次调用它一样?
2021-05-03 23:34:13
这很有用。在我的测试中,超时执行 unbindWatch 似乎很重要。
2021-05-08 23:34:13
最好避免超时
2021-05-08 23:34:13
在这种情况下,您应该使用 $timeout,您也可以取消注册!
2021-05-09 23:34:13

如果您想在发生某些事情后立即清除它,您也可以清除回调中的手表。这样你的 $watch 将保持活动状态直到被使用。

像这样...

var clearWatch = $scope.$watch('quartzCrystal', function( crystal ){
  if( isQuartz( crystal )){
    // do something special and then stop watching!
    clearWatch();
  }else{
    // maybe do something special but keep watching!
  } 
}

有时你的 $watch 正在调用dynamically它会创建它的实例,所以你必须在你的$watch函数之前调用注销函数

if(myWatchFun)
  myWatchFun(); // it will destroy your previous $watch if any exist
myWatchFun = $scope.$watch("abc", function () {});

理想情况下,当您离开示波器时,应该移除每个自定义手表。

它有助于更​​好的内存管理和更好的应用程序性能。

// call to $watch will return a de-register function
var listener = $scope.$watch(someVariableToWatch, function(....));

$scope.$on('$destroy', function() {
    listener(); // call the de-register function on scope destroy
});