AngularJS:清除$ watch
我在我的AngularJS应用程序中有一个监视function。
$scope.$watch('quartzCrystal', function () { ... }
但是,在一些条件(在我的例子中,更改我的单页应用程序中的页面 )之后,我想停止该手表(就像清除超时一样)。
我怎样才能做到这一点?
$watch
返回一个注销function。 调用它将取消注册$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! } }
有时候你的$ watch dynamically
调用,它会创build它的实例,所以你必须在你的$watch
函数之前调用deregistration函数
if(myWatchFun) myWatchFun(); // it will destroy your previous $watch if any exist myWatchFun = $scope.$watch("abc", function () {});
如果你有太多的观察者,你需要清除所有的观察者,你可以把他们推到一个数组中,并销毁每一个$循环的手表。
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 = [];
理想情况下,每个定制手表在离开示波器时都应该被移除。
它有助于更好的内存pipe理和更好的应用程序性能。
// 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;