AngularJS: очистить $ watch
У меня есть функция часов в моем приложении AngularJS.
$scope.$watch('quartzCrystal', function () {
...
}
однако, после некоторого условия (в моем примере, изменение страницы на моем одностраничное приложение) Я хочу остановить эти часы (как будто время ожидания очистки).
Как я могу это сделать?
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 });