Как очистить подписки на события $rootScope.$on из службы?
У меня есть Factory, которая инициализируется в разных контроллерах в моем приложении AngularJS, где объявляется подписка на событие $rootScope.$on. Моя проблема в том, что когда контроллер уничтожается, событие не очищается. Я прочитал и обнаружил, что с помощью контроллеров и директив вы можете настроить $watch на $destroy для очистки, но как насчет сервисов? Как вы чистите сервисы?
Вот базовый планкер моей проблемы: 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();
});