web-dev-qa-db-fra.com

AngularJS: Clear $ montre

J'ai une fonction de surveillance dans mon application AngularJS.

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

Cependant, après certaines conditions (dans mon exemple, changer de page sur mon application d'une seule page ), je souhaite arrêter cette surveillance (comme pour effacer le délai d'attente).

Comment puis je faire ça?

274
kamaci

$watch renvoie une fonction de désenregistrement. L'appeler désenregistrerait le $watcher.

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

scope. $ watch renvoie une fonction que vous pouvez appeler et qui désinscrira la montre.

Quelque chose comme:

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

setTimeout(function() {
    unbindWatch();
}, 1000);
46
Anders Ekdahl

Vous pouvez également effacer la montre à l'intérieur du rappel si vous souhaitez l'effacer juste après un événement. Ainsi, votre montre $ restera active jusqu'à son utilisation.

Ainsi...

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

Quelque temps, votre $ watch appelle dynamically et créera ses instances. Vous devrez donc appeler la fonction de désenregistrement avant votre fonction $watch.

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

Si vous avez trop d'observateurs et que vous devez tous les effacer, vous pouvez les pousser dans un tableau et détruire tous les $watch d'une boucle.

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

Idéalement, chaque montre personnalisée doit être retirée lorsque vous quittez le viseur.

Cela contribue à une meilleure gestion de la mémoire et à de meilleures performances des applications.

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