https://docs.angularjs.org/guide/directive
通过监听此事件,您可以删除可能导致内存泄漏的事件侦听器。注册到范围和元素的侦听器在销毁时会自动清理,但如果您在服务上注册了侦听器,或者在未被删除的DOM节点上注册了侦听器,则必须自己清理它,否则可能会引入内存泄漏。
最佳实践:指令应该在自己之后清理。您可以使用element. on('$销毁',…)或scope。$on('$销毁',…)在删除指令时运行清理函数。
问题:
我有一个元素. on“点击”,(事件)-
- 当指令被销毁时,是否有对
元素. on
的内存引用以防止它被垃圾回收?
- Angular留档声明,我应该使用一个处理程序来删除
美元销毁
发出事件的事件侦听器。我的印象是销毁()
删除了事件侦听器,不是这样吗?
共1个答案
匿名用户
首先,重要的是要了解有两种“事件侦听器”:
>
通过$on
注册的范围事件侦听器:
$scope.$on('anEvent', function (event, data) {
...
});
通过例如on
或bind
附加到元素的事件处理程序:
element.on('click', function (event) {
...
});
当$scope.$销毁()
执行时,它将删除在该$scope上通过$on
注册的所有侦听器。
它不会删除DOM元素或任何附加的第二类事件处理程序。
这意味着在指令的链接函数中手动从示例调用$scope.$销毁()
不会删除通过例如element. on
附加的处理程序,也不会删除DOM元素本身。
请注意,删除
是一个jqLite方法(如果jQuery在AngularjS之前加载,则为jQuery方法),并且在标准DOMElement Object上不可用。
当执行element. delete()
时,该元素及其所有子元素将从DOM中删除,所有事件处理程序将一起通过例如element.on
附加。
它不会破坏与元素关联的$scope。
为了让它更加混乱,还有一个名为$销毁
的jQuery事件。有时在使用删除元素的第三方jQuery库时,或者如果您手动删除它们,您可能需要在发生这种情况时执行清理:
element.on('$destroy', function () {
scope.$destroy();
});
这取决于指令如何“销毁”。
一个正常的情况是指令被销毁,因为ng-view
更改了当前视图。当这种情况发生时,ng-view
指令将销毁关联的$scope,切断对其父作用域的所有引用,并在元素上调用删除()
。
这意味着如果该视图在被ng-view
销毁时在其链接函数中包含带有this的指令:
scope.$on('anEvent', function () {
...
});
element.on('click', function () {
...
});
两个事件侦听器都将被自动删除。
但是,需要注意的是,这些侦听器中的代码仍然可能导致内存泄漏,例如,如果您实现了常见的JS内存泄漏模式循环引用
。
即使在这种正常情况下,由于视图更改而导致指令被销毁,您也可能需要手动清理一些东西。
例如,如果您在$rootScope
上注册了一个侦听器:
var unregisterFn = $rootScope.$on('anEvent', function () {});
scope.$on('$destroy', unregisterFn);
这是必需的,因为$rootScope
在应用程序的生命周期内永远不会被销毁。
如果您使用的另一个pub/sub实现在$scope被销毁时不会自动执行必要的清理,或者您的指令将回调传递给服务,情况也是如此。
另一种情况是取消$间隔
/$timeout
:
var promise = $interval(function () {}, 1000);
scope.$on('$destroy', function () {
$interval.cancel(promise);
});
如果您的指令将事件处理程序附加到元素,例如当前视图之外的元素,您也需要手动清理这些元素:
var windowClick = function () {
...
};
angular.element(window).on('click', windowClick);
scope.$on('$destroy', function () {
angular.element(window).off('click', windowClick);
});
这些是当指令被Angular“销毁”时该怎么做的一些示例,例如被ng-view
或ng-if
销毁。
如果您有管理DOM元素等生命周期的自定义指令,它当然会变得更加复杂。
相关问题
- AngularJs-RXJS可观察退订
- AngularJS-$销毁是否删除事件侦听器?
- 对于Angular router事件可观察,为什么没有取消订阅()?
- 如何以异步方式删除/更新以及何时应该取消订阅?
- 组件被销毁和重访后,订阅在ngOnInit函数中运行
- Angular Service已被销毁,但为什么订阅仍在接收来自可观察的订阅?
- 是否需要基于fromEvent取消订阅表单事件
- 为什么组件销毁后订阅仍然存在?
- 可观察源对象被销毁时的内存泄漏
- 如何为许多作者和许多读者(线程)添加和删除HashMap?
- Java并发:当并发线程只删除元素时,HashMap Vs并发HashMap
- 事件处理程序作用于事件源
- 事件调用时的javafx错误
- JavaFX:事件OnMouseExed工作不正确
- 鼠标在Anchorpane javafx上按下事件
- 标签未显示在鼠标事件JavaFx上
- 数组的JavaFX事件处理程序
- 死锁是由一堆锁造成的?不可能的事件导致的还是只是错误的直觉
- 当我执行点击事件时,我想获得GridPane的索引
- Javafx-鼠标点击事件,撤消上一次鼠标点击所做的事情