Javascript AngularJS:清除$watch
我的AngularJS应用程序中有一个watch函数Javascript AngularJS:清除$watch,javascript,angularjs,watch,Javascript,Angularjs,Watch,我的AngularJS应用程序中有一个watch函数 $scope.$watch('quartzCrystal', function () { ... } 但是,在某种情况下(在我的示例中,更改我的页面),我希望停止该手表(就像清除超时一样) 如何才能做到这一点?scope.$watch返回一个可以调用的函数,该函数将注销手表 比如: var unbindWatch = $scope.$watch("myvariable", function() { //... }); set
$scope.$watch('quartzCrystal', function () {
...
}
但是,在某种情况下(在我的示例中,更改我的页面),我希望停止该手表(就像清除超时一样)
如何才能做到这一点?scope.$watch返回一个可以调用的函数,该函数将注销手表 比如:
var unbindWatch = $scope.$watch("myvariable", function() {
//...
});
setTimeout(function() {
unbindWatch();
}, 1000);
$watch
返回注销函数。调用它将取消注册$watcher
var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch
有时,$watch会动态调用
,
,它会创建实例,因此您必须在调用$watch
函数之前调用注销函数
if(myWatchFun)
myWatchFun(); // it will destroy your previous $watch if any exist
myWatchFun = $scope.$watch("abc", function () {});
如果您想在事情发生后立即清除,也可以清除回调中的手表。这样,您的$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
var watchers = [];
watchers.push( $scope.$watch('watch-xxx', function(newVal){
//do something
}));
for(var i = 0; i < watchers.length; ++i){
if(typeof watchers[i] === 'function'){
watchers[i]();
}
}
watchers = [];
var观察者=[];
watchers.push($scope.$watch('watch-xxx',function(newVal))函数{
//做点什么
}));
对于(变量i=0;i
理想情况下,当您离开示波器时,应移除所有定制手表
它有助于更好的内存管理和更好的应用程序性能
// 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
});
您知道在控制器生命周期结束时(比如在
$on('$destroy')
上)取消注册所有侦听器是一种好做法还是AngularJS会处理它们?谢谢当作用域被销毁时,所有的观察者都将被删除,您不需要管理这些。您可以在这里看到一个有趣的讨论来解释这一问题:基本上,如果您将侦听器分配给$rootScope,您必须自行取消分配,否则它将在$scope更改中保持不变。$scope上的观察者会被$scope销毁($scope在角度上不是单例,它们会在需要时被创建和销毁)。但是,如果我只想让观察者检查值是否存在,然后在值存在时做一些更改,然后取消注册自己,我已经尝试过了-var listen=$scope.$watch,该怎么办('mvIdentity.currentUser',函数(currentUser){test=1;console.log(“-->”+$scope.updateemail+“--”+test);listen();})@UmurKontacı实际上deadman的评论是完全有效的,因为您的原始评论并不适用于所有情况。是的,您可以在watchFn中解除绑定!简单的用例:您只想观看并执行watchFn一次,然后停止观看。我是否可以在调用unbind函数后重新绑定手表,就像再次调用它一样?这是我们在我的测试中,在超时情况下解除绑定手表似乎很重要。在这种情况下,您应该使用$timeout,您还可以取消注册它!最好避免超时