AngularJS:清除$ watch

kam*_*aci 274 javascript watch angularjs

我的AngularJS应用程序中有一个watch功能.

$scope.$watch('quartzCrystal', function () {
   ...
}
Run Code Online (Sandbox Code Playgroud)

但是,在某些条件之后(在我的例子中,在我的单页应用程序中更改页面)我想要停止该监视(就像清除超时一样).

我怎样才能做到这一点?

Umu*_*acı 515

$watch返回注销功能.调用它会取消注册$watcher.

var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch
Run Code Online (Sandbox Code Playgroud)

  • 当范围被破坏时,所有观察者都将被删除,您无需管理这些观察者 (78认同)
  • 你是否知道在控制器生命周期结束时取消注册所有听众是否是一个好习惯(比如`on on('$ destroy')`)或AngularJS会照顾它们吗?谢谢! (23认同)
  • 你可以在这里看到一个有趣的讨论来解释这个问题:https://github.com/angular/angular.js/issues/4574基本上,如果你将一个监听器分配给$ rootScope,你必须取消它自己的分配,或者它将持续通过$ scope更改.$ scope的观察者被$ scope破坏($ scope在Angular中不是单例,并且在需要时会被创建和销毁). (6认同)
  • @UmurKontacı实际上,死人的评论完全有效,因为您的原始评论对于每个案例都不正确. (4认同)
  • 但是,如果我只希望观察者检查该值是否存在然后何时存在做一些更改然后自我注册我已经尝试过 - var listen = $ scope.$ watch('mvIdentity.currentUser',function(currentUser) ){test = 1; console.log(" - >"+ $ scope.updateemail +" - "+ test); listen();}); (3认同)

And*_*ahl 47

范围.$ watch返回一个可以调用的函数,该函数将取消注册该表.

就像是:

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

setTimeout(function() {
    unbindWatch();
}, 1000);
Run Code Online (Sandbox Code Playgroud)

  • 是的,你可以在watchFn中取消绑定!简单的用例:您只想观看并执行一次watchFn,然后停止观看. (14认同)
  • 我想知道你是否可以在watchFn的范围内调用它 (4认同)
  • 我打电话给unbind函数后能否重新启动手表,比如再次调用它? (3认同)

SoE*_*zPz 21

如果您想在发生某些事情后立即清除它,您也可以清除回调中的手表.这样你的$ 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!
  } 
}
Run Code Online (Sandbox Code Playgroud)