【发布时间】:2013-02-04 03:23:59
【问题描述】:
我的 AngularJS 应用程序中有一个监视功能。
$scope.$watch('quartzCrystal', function () {
...
}
但是,在某些情况下(在我的示例中,更改我的single-page application 的页面)我想停止那个手表(就像清除超时一样)。
我该怎么做?
【问题讨论】:
标签: javascript angularjs watch
我的 AngularJS 应用程序中有一个监视功能。
$scope.$watch('quartzCrystal', function () {
...
}
但是,在某些情况下(在我的示例中,更改我的single-page application 的页面)我想停止那个手表(就像清除超时一样)。
我该怎么做?
【问题讨论】:
标签: javascript angularjs watch
$watch 返回一个注销函数。调用它会注销$watcher。
var listener = $scope.$watch("quartz", function () {});
// ...
listener(); // Would clear the watch
【讨论】:
$on('$destroy') 上)取消注册所有侦听器是否是一种好习惯,还是 AngularJS 会处理它们?谢谢!
scope.$watch 返回一个您可以调用的函数,该函数将取消注册手表。
类似:
var unbindWatch = $scope.$watch("myvariable", function() {
//...
});
setTimeout(function() {
unbindWatch();
}, 1000);
【讨论】:
如果你想在事情发生后立即清除它,你也可以在回调中清除手表。这样,您的 $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 正在调用 dynamically 并且它会创建它的实例,因此您必须在您的 $watch 函数之前调用注销函数
if(myWatchFun)
myWatchFun(); // it will destroy your previous $watch if any exist
myWatchFun = $scope.$watch("abc", function () {});
【讨论】:
理想情况下,当您离开作用域时,应该移除每个自定义手表。
它有助于更好的内存管理和更好的应用性能。
// 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。
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 = [];
【讨论】: