如何在AngularJS中取消注册到rootscope的广播事件?

前端之家收集整理的这篇文章主要介绍了如何在AngularJS中取消注册到rootscope的广播事件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下:
angular.module('test')
    .controller('QuestionsStatusController1',['$rootScope','$scope','$resource','$state',function ($rootScope,$scope,$resource,$state) {

        $scope.action2 = function() {
            $rootScope.$broadcast('action2@QuestionStatusController1');
        }

    }]);

angular.module('test')
   .controller('QuestionsStatusController2',$state) {

    $rootScope.$on('action2@QuestionStatusController1',function {
         //write your listener here
    })

   }]);

这是我的理解,我需要取消注册侦听事件。有人可以告诉我我怎么编码/这样做?

如果你不注销事件,你会得到一个内存泄漏,因为你传递给$ on的函数不会被清除(因为它的引用仍然存在)。更重要的是,在其范围内的函数引用的任何变量也将被泄露。这将导致您的函数多次调用,如果您的控制器在应用程序中多次创建/销毁。幸运的是,AngularJS提供了一些有用的方法来避免内存泄漏和不必要的行为:

> $ on方法返回一个可以调用来取消注册事件侦听器的函数。您将需要将您的注销函数保存为一个变量供以后使用:var cleanUpFunc = $ scope。$ on(‘yourevent’,…);请参阅$ on:http://docs.angularjs.org/api/ng.$rootScope.Scope#$on的文档
>每当一个范围在Angular中被清除(即一个控制器被销毁)一个$ destroy事件在该范围被触发。你可以注册到$ scope的$ destroy事件,并从那里调用你的cleanUpFunc。

您可以将这两个有用的内容绑定在一起,以正确清理您的订阅。我把这样的一个例子:http://plnkr.co/edit/HGK9W0VJGip6fhYQQBCg?p=preview.如果你注释掉行cleanUpFunc();然后点击切换和做东西按钮几次,你会注意到我们的事件处理程序被调用多次,这是不是真的需要。

现在,毕竟,为了使你的具体情况正确,只需将QuestionsStatusController2中的代码更改为以下内容

angular.module('test')
   .controller('QuestionsStatusController2',$state) {

    var cleanUpFunc = $rootScope.$on('action2@QuestionStatusController1',function {
         //write your listener here
    });

    $scope.$on('$destroy',function() {
        cleanUpFunc();
    });

   }]);

通过调用$ destroy中的cleanUpFunc(),您的action2 @ QuestionStatusController1事件的事件监听器将被取消订阅,当您的控制器被清除时,您将不再泄漏内存。

原文链接:https://www.f2er.com/angularjs/146415.html

猜你在找的Angularjs相关文章