У меня есть функция часов в приложении AngularJS.
$scope.$watch('quartzCrystal', function () {
...
}
Однако, после некоторого условия (в моем примере, меняя страницу на моем одностраничном приложении), я хочу остановить эти часы (например, как тайм-аут очистки).
Как я могу это сделать?
$watch
возвращает функцию дерегистрации. Вызвав его, вы отмените регистрацию $watcher
.
var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch
scope. $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!
}
}
Некоторое время ваши $watch вызывают 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
});
Отбрасывая копию наблюдателей, вы можете использовать это:
watchers = void 0;
$on('$destroy')
), или AngularJS позаботится о них? Спасибо!