问题描述
我试图弄清楚 angular base 是否会自动解除绑定观察者和作用域事件与 $scope.$on(...)
或 $scope.$watch(...)
当范围被销毁时?
I'm trying to figure out if angular base automatically unbinds watchers and scope events bound with $scope.$on(...)
or $scope.$watch(...)
when scope is destroyed?
假设我有以下代码:
$scope.$on('someEvents', handleSomeEvent);
$scope.$watch('someProperty', handleSomePropertyChange);
在作用域上触发 $destroy 事件时,是否需要手动解除这些观察者和事件的绑定?
Do I need to manually unbind these watchers and events when $destroy event is triggered on scope?
推荐答案
根据 Angular 文档$scope:
'$destroy()' 当希望作用域及其子作用域与父作用域永久分离时,必须在作用域上调用'$destroy()',从而通过调用停止参与模型更改检测和侦听器通知.
还有
移除也意味着当前范围有资格进行垃圾回收.
所以看起来当 $destroy()
被调用时,所有的观察者和监听者都会被移除,并且代表范围的对象变得有资格进行垃圾收集
.
So it seems when $destroy()
is called all the watchers and listeners get removed and the object which represented the scope becomes eligible for garbage collection
.
如果我们查看 destroy()
源代码 我们会看到一行:
If we look at the destroy()
source code we'll see a line :
forEach(this.$$listenerCount, bind(null, decrementListenerCount, this));
应该删除所有侦听器.
正如@glepretre 所提到的,它适用于控制器中的观察者和监听者.上面列出的同一个文档页面说:
As mentioned by @glepretre it applies to the watchers and listeners in the controller. The same doc page listed above says that:
请注意,在 AngularJS 中,还有一个 $destroy jQuery 事件,可用于在元素从 DOM 中删除之前清理 DOM 绑定.
所以如果你在指令中有特定的监听器,你应该监听 $destroy
事件并自己做必要的清理
So if you have specific listeners in the directives you should listen to the $destroy
event and do the necessary cleanup yourself
这篇关于angular.js $destroy 事件 - 我应该手动解除绑定吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!