首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否需要在$scope $destroy事件中解除绑定$destroy?

是否需要在$scope $destroy事件中解除绑定$destroy?
EN

Stack Overflow用户
提问于 2017-02-15 10:53:17
回答 4查看 4.7K关注 0票数 10

我有使用$on绑定事件的指令,当作用域被销毁时,我需要删除该绑定吗?还是它是自动完成的?我还需要打电话给$element.off吗?

代码语言:javascript
复制
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();
        });
    }
};
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-02-15 10:58:37

$scope.$on() 侦听器由于视图中的E2E绑定而失去表示时,将自动销毁/清除E2E侦听器。请注意,$rootScope.$on()绑定不会发生这种情况。您也可以看看$scope文档的AngularJS

用几句话回答:

  • $scope.$on();将自动销毁。
  • 您需要手动销毁$rootScope.$on()

文件上说:

范围破坏-当不再需要子作用域时,子作用域创建者有责任通过作用域销毁它们。$破坏() API。这样做是为了停止将$digest调用传播到子作用域中,并允许垃圾回收器回收子作用域模型使用的内存。

如何销毁$rootScope.$on()的示例

代码语言:javascript
复制
// 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')
票数 14
EN

Stack Overflow用户

发布于 2017-02-15 11:00:53

不,你不需要删除那个绑定。当作用域被破坏时,它将被移除。但是,如果将事件绑定到$rootScope,请始终记住解除绑定!这样做很容易:

代码语言:javascript
复制
        var unregister = $rootScope.$on('eventName', function(e) {
            //doSomething
        });


        $scope.$on('$destroy', unregister);
票数 4
EN

Stack Overflow用户

发布于 2017-02-15 10:55:49

范围破坏-当不再需要子作用域时,子作用域创建者有责任通过作用域销毁它们。$破坏()API。这样做是为了停止将$digest调用传播到子作用域中,并允许垃圾回收器回收子作用域模型使用的内存。

注册到作用域和元素的侦听器在销毁时会自动清除,但是如果您在服务上注册了侦听器、rootScope或在未被删除的DOM节点上注册了侦听器,则必须自己清理它,否则可能会导致内存泄漏。

在执行$scope.时,它将删除通过$on 在上注册的注册的所有侦听器。它不会删除DOM元素或通过以下方式添加的任何附加事件处理程序:

代码语言:javascript
复制
element.on('click', function (event) {
  ...
});

有关angular.element https://docs.angularjs.org/api/ng/function/angular.element的更多信息

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42247286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档