Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript AngularJS:清除$watch_Javascript_Angularjs_Watch - Fatal编程技术网

Javascript 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

我的AngularJS应用程序中有一个watch函数

$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,您还可以取消注册它!最好避免超时