清除$watch

我在我的AngularJS应用程序中有一个手表函数。

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

然而,在某些条件之后(在我的例子中,在单页面应用程序处更改页面),我想停止该手表(就像清除超时一样)。

我该怎么做呢?

124523 次浏览

范围。$watch返回一个函数,你可以调用它来注销手表。

喜欢的东西:

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


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

$watch返回一个注销函数。调用它将注销$watcher

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

有时候你的$watch调用dynamically,它会创建它的实例,所以你必须在你的$watch函数之前调用注销函数

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

如果你想在某些事情发生后立即清除它,你也可以在回调中清除手表。这样,你的$watch在使用前将一直保持活动状态。

像这样…

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

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