AngularJS: очистить $ watch


У меня есть функция часов в моем приложении AngularJS.

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

однако, после некоторого условия (в моем примере, изменение страницы на моем одностраничное приложение) Я хочу остановить эти часы (как будто время ожидания очистки).

Как я могу это сделать?

7 265

7 ответов:

$watch возвращает функцию отмены регистрации. Вызов его будет отменить регистрацию $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!
  } 
}

некоторое время ваш $часы звонит dynamically и он будет создавать свои экземпляры, поэтому вам нужно вызвать функцию отмены регистрации перед вашим $watch функции

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

Если у вас слишком много наблюдателей и вам нужно очистить все из них, вы можете нажать их в массив и уничтожить каждый $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 = [];

В идеале, все пользовательские часы должны быть удалены, когда вы покидаете область.

это помогает в лучшем управлении памятью и лучшей производительности приложения.

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