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?
$watch
renvoie une fonction de désenregistrement. L'appeler désenregistrerait le $watcher
.
var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch
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);
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!
}
}
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 () {});
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 = [];
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
});