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

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

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

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

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

Ответ 1

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

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

Ответ 2

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

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

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

setTimeout(function() {
    unbindWatch();
}, 1000);

Ответ 3

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

Так же...

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

watchers = void 0;