我在我的AngularJS应用程序中有一个手表函数。

$scope.$watch('quartzCrystal', 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返回一个注销函数。调用它将注销$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 () {});

理想情况下,当你离开范围时,每个定制手表都应该被移除。

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

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

如果你想在某些事情发生后立即清除它,你也可以在回调中清除手表。这样,你的$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 = [];