如何在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的文档 您可以将这两个有用的内容绑定在一起,以正确清理您的订阅。我把这样的一个例子: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事件的事件监听器将被取消订阅,当您的控制器被清除时,您将不再泄漏内存。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |