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

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

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

我该怎么做呢?


当前回答

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

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

其他回答

理想情况下,当你离开范围时,每个定制手表都应该被移除。

它有助于更好的内存管理和更好的应用程序性能。

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

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

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

如果你有太多的观察者,你需要清除所有的观察者,你可以将它们推入一个数组,并在循环中销毁每个$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 = [];

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

喜欢的东西:

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

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

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

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