AngularJS: Clear $ watch

242

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

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

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

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

Теги:
watch

7 ответов

499
Лучший ответ

$watch возвращает функцию дерегистрации. Вызвав его, вы отмените регистрацию $watcher.

var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch
  • 23
    Знаете ли вы, является ли хорошей практикой отмена регистрации всех ваших слушателей в конце жизненного цикла контроллера (например, на $on('$destroy') ), или AngularJS позаботится о них? Спасибо!
  • 78
    Все наблюдатели будут удалены, когда область будет уничтожена, вам не нужно управлять этими
Показать ещё 6 комментариев
41

scope. $watch возвращает функцию, которую вы можете вызвать, и которая будет отменять регистрацию часов.

Что-то вроде:

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

setTimeout(function() {
    unbindWatch();
}, 1000);
  • 4
    Интересно, можно ли назвать это в рамках watchFn?
  • 14
    Да, вы можете отменить привязку в watchFn! Простой вариант использования: вы хотите посмотреть и запустить watchFn только один раз, а затем прекратить просмотр.
Показать ещё 4 комментария
16

Вы также можете очистить часы внутри обратного вызова, если вы хотите очистить его сразу после того, как что-то произойдет. Таким образом, ваши часы будут оставаться активными до тех пор, пока не будут использованы.

Так же...

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!
  } 
}
3

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

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

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

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

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

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

Отбрасывая копию наблюдателей, вы можете использовать это:

watchers = void 0;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню