我有使用$on绑定事件的指令,当作用域被销毁时,我需要删除该绑定吗?还是它是自动完成的?我还需要打电话给$element.off吗?
return {
restrict: 'A',
link: function($scope, $element, $attrs) {
$element.on('load', function() {
$element[0].contentWindow.focus();
});
$scope.$on('iframe:focus', function() {
$element[0].contentWindow.focus();
});
}
};发布于 2017-02-15 10:58:37
当$scope.$on() 侦听器由于视图中的E2E绑定而失去表示时,将自动销毁/清除E2E侦听器。请注意,$rootScope.$on()绑定不会发生这种情况。您也可以看看$scope文档的AngularJS。
用几句话回答:
$scope.$on();将自动销毁。$rootScope.$on()。文件上说:
范围破坏-当不再需要子作用域时,子作用域创建者有责任通过作用域销毁它们。$破坏() API。这样做是为了停止将$digest调用传播到子作用域中,并允许垃圾回收器回收子作用域模型使用的内存。
如何销毁$rootScope.$on()的示例
// bind event
const registerScope = $rootScope.$on('someEvent', function(event) {
console.log("fired");
});
// clean up
$scope.$on('$destroy', registerScope);这个普朗克将向您展示$scope.$on()和$rootScope.$on()的不同行为。
通过切换此普鲁克尔中的视图,控制器将被重新绑定到您的视图。每次切换视图而不破坏视图的事件绑定时,都会绑定$rootScope.$on();事件。这样,$rootScope.$on()侦听器将被堆叠/乘以。这种情况不会发生在$scope.$on()绑定中,因为它将通过切换视图(丢失DOM中的E2E绑定表示)而销毁。
请注意:
$scope.$on('event');将收听$scope.$broadcast('event') & $rootScope.$broadcast('event')$rootScope.$on('event');只会听$rootScope.$broadcast('event')发布于 2017-02-15 11:00:53
不,你不需要删除那个绑定。当作用域被破坏时,它将被移除。但是,如果将事件绑定到$rootScope,请始终记住解除绑定!这样做很容易:
var unregister = $rootScope.$on('eventName', function(e) {
//doSomething
});
$scope.$on('$destroy', unregister);发布于 2017-02-15 10:55:49
范围破坏-当不再需要子作用域时,子作用域创建者有责任通过作用域销毁它们。$破坏()API。这样做是为了停止将$digest调用传播到子作用域中,并允许垃圾回收器回收子作用域模型使用的内存。
注册到作用域和元素的侦听器在销毁时会自动清除,但是如果您在服务上注册了侦听器、rootScope或在未被删除的DOM节点上注册了侦听器,则必须自己清理它,否则可能会导致内存泄漏。
在执行$scope.时,它将删除通过$on 在上注册的注册的所有侦听器。它不会删除DOM元素或通过以下方式添加的任何附加事件处理程序:
element.on('click', function (event) {
...
});有关angular.element https://docs.angularjs.org/api/ng/function/angular.element的更多信息
https://stackoverflow.com/questions/42247286
复制相似问题