Я работаю для приложения, и я хочу обмениваться угловыми js с третьей библиотекой js. Для этого я использовал метод pubsub с использованием медиатора js. Но из-за этого, когда я подписываюсь на какое-либо событие, он подписывается несколько раз, и из-за этого, когда я публикую событие, он срабатывает несколько раз.Угловые js подписываются несколько раз и запускают несколько событий
Я использовал ниже код:
angular.module('app')
.service('mediator', function() {
var mediator = window.mediator || new Mediator();
return mediator;
});
// Main controller begins here
angular.module('app').controller('MainController', MainController);
MainController.$inject = ['mediator'];
function MainController(mediator){
var vm = this;
vm.title = "This is main controller."
vm.sendMessage = function(){
mediator.publish('something', { data: 'Some data' });
}
}
// First page controller begins here
angular.module('app').controller('FirstController', FirstController);
FirstController.$inject = ['mediator'];
function FirstController(mediator){
var vm = this;
console.log('Subscribed events for first controller.');
var counter = 0;
mediator.subscribe('something', function(data){
console.log('Fired event for '+ counter.toString());
counter = counter + 1;
});
}
Вот plunker для лучшего объяснения: Plunkr
Чтобы проверить эту plunker:
- Run plunker.
- Открытая консоль разработчика.
- Нажмите на первой странице
- Нажмите огонь событие
- Нажмите на второй странице
- Нажмите на первой странице
- Нажмите на огонь событие
Как перейти на первую страницу второй раз, его снова подпишутся на мероприятие и будут стрелять дважды. Это будет подписано несколько раз, когда вы переходите на первую страницу несколько раз.
Пожалуйста, дайте мне знать, если я делаю что-то неправильно.
вы в настоящее время подписываетесь каждый раз, когда загружается контроллер, который будет при каждом переходе на страницу. Это похоже на простой случай отслеживания, если вы подписаны или нет, и используете 'if (! Подписанный)' или аналогичный. – Claies
Ну, вы не отписываетесь, когда ваш контроллер уничтожен. Таким образом, он продолжает подписываться. У вас есть не только несколько консольных журналов, но и хорошая утечка памяти. –
@JBNizet: Можете ли вы сообщить нам, как отменить подписку на событие, используя медиатор js? –