Как очистить $ rootScope. $ От подписки на события изнутри службы?
У меня есть фабрика, которая инициализируется в разных контроллерах моего приложения AngularJS, где объявляется подписка $ rootScope. $ On event. Моя проблема в том, что когда контроллер уничтожен, событие не очищается. Я сделал чтение и обнаружил, что с контроллерами и директивами вы можете настроить $ watch на $ destroy для очистки, но как насчет сервисов? Как вы очищаете услуги?
Вот базовый плунжер моей проблемы: 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
@twDuke Я в основном завернул $ на событие подписки в логическом условном выражении, а затем только инициализировался один раз, установив переменную isLoaded в true на первом проходе. – wbeange