[英]AngularJS Factory $rootScope.$on Cleanup
如何從服務內部清理$ rootScope。$ on事件訂閱?
我有一個在我的AngularJS應用程序中的不同控制器中初始化的Factory,其中聲明了$ rootScope。$ on事件訂閱。 我的問題是,當控制器被銷毀時,事件不會被清除。 我已經完成閱讀並發現使用控制器和指令你可以在$ destroy上設置$ watch以進行清理,但是對於服務呢? 你如何清理服務?
這是我的問題的基本插件: 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();
});
您可以在創建新事件之前終止哨兵。 創建新控制器后,rootScopeOn變量將保持不變,因此每次重新初始化時都可以將其刪除。
app.factory('HelloWorldFactory', function($rootScope) {
var rootScopeOn;
// setup event subscription on initialization
function HelloWorldFactory() {
console.log('init helloWorldFactory');
if (typeof rootScopeOn === 'function') {
rootScopeOn();
}
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($scope);
});
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.