AngularJS:清除$ watch

我在我的AngularJS应用程序中有一个监视function。

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

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

我怎样才能做到这一点?

$watch返回一个注销function。 调用它将取消注册$watcher

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

$ watch返回一个可以调用并取消注册手表的函数。

就像是:

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

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

像这样…

 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调用,它会创build它的实例,所以你必须在你的$watch函数之前调用deregistration函数

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

如果你有太多的观察者,你需要清除所有的观察者,你可以把他们推到一个数组中,并销毁每一个$循环的手表。

 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 = []; 

理想情况下,每个定制手表在离开示波器时都应该被移除。

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

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

为了丢弃观察者的副本,你可以使用这个:

 watchers = void 0;