サービス内から $rootScope.$on イベント サブスクリプションをクリーンアップするにはどうすればよいですか?
$rootScope.$on イベント サブスクリプションが宣言されている、AngularJS アプリケーションのさまざまなコントローラーで初期化されている Factory があります。私の問題は、コントローラーが破棄されると、イベントがクリーンアップされないことです。読んだところ、コントローラーとディレクティブを使用すると、クリーンアップのために $destroy に $watch をセットアップできることがわかりましたが、サービスについてはどうでしょうか? サービスをどのようにクリーンアップしますか?
これが私の問題の基本的なプランカーです: http://plnkr.co/edit/dY3BVW。「子の作成」ボタンを何度もクリックして、$rootScope.$on でファクトリを初期化する子コントローラーを初期化します。[ブロードキャスト] をクリックしてブラウザー コンソールを開くと、子コントローラーが破棄された後に発生する一連のイベント サブスクリプションが表示されます。
プランカーからのスニペット:
// 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();
});