【发布时间】:2015-01-09 19:39:56
【问题描述】:
如何从服务内部清除 $rootScope.$on 事件订阅?
我有一个工厂正在我的 AngularJS 应用程序的不同控制器中初始化,其中声明了 $rootScope.$on 事件订阅。我的问题是,当控制器被销毁时,事件没有被清理。我已经阅读并发现使用控制器和指令可以在 $destroy 上设置 $watch 进行清理,但是对于服务呢?你如何清理服务?
这是我的问题的基本 Plunker:http://plnkr.co/edit/dY3BVW。多次单击“创建子”按钮以初始化子控制器,该子控制器将使用 $rootScope.$on 初始化工厂。当您单击“广播”时打开浏览器控制台,您将看到一堆事件订阅被触发,即子控制器被销毁后的事件。
来自 Plunker 的片段:
// setup rootScope on in Factory and create multiple instances
// to show that event subscriptions are not cleaned up
// TODO: how do you cleanup in factory?
app.factory('HelloWorldFactory', function($rootScope) {
// setup event subscription on initialization
function HelloWorldFactory() {
console.log('init helloWorldFactory');
var rootScopeOn = $rootScope.$on('test', function() {
console.log('test sub', Math.random());
});
}
return HelloWorldFactory;
});
// child ctrl will init a new factory instance
app.controller('ChildCtrl', function($scope, HelloWorldFactory) {
$scope.name = 'Child';
var helloWolrdFactory = new HelloWorldFactory();
});
【问题讨论】:
-
还想知道,剩余的事件监听器会导致一些非常讨厌的行为。
-
@twDuke 我基本上将 $on 订阅事件包装在一个布尔条件中,然后只通过在第一遍将 isLoaded 变量设置为 true 来初始化一次。
标签: javascript angularjs angularjs-service angularjs-factory rootscope