我有以下:
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提供了一些有用的方法来避免内存泄漏和不必要的行为:
原文链接:https://www.f2er.com/angularjs/146415.html> $ 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事件的事件监听器将被取消订阅,当您的控制器被清除时,您将不再泄漏内存。