Ich arbeite für eine Anwendung, und ich möchte Angular js mit einer Drittanbieter-js-Bibliothek kommunizieren. Dafür habe ich pubsub-Methode mit Mediator js verwendet. Aber deswegen, wenn ich ein Event abonniere, abonniere es mehrere Male und aufgrund dessen, wenn ich ein Event veröffentliche, wird es mehrmals ausgelöst. Um zu testen, diese Plunker PlunkrAngular js abonnieren mehrere Male und feuern mehrere Ereignisse
:
- Run Plunker für eine bessere Erklärung
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; }); }
Hier ist die Plunker:
I unten Code verwendet haben.
- Öffnen Sie die Entwicklerkonsole.
- Klicken Sie auf Erste Seite
- Click Brandereignis
- Klicken Sie auf der zweiten Seite
- Klicken Sie auf der ersten Seite
- Klicken Sie auf Brandereignis
Wie Sie zur ersten Seite zweiten Mal navigieren, es wird das Ereignis erneut abonnieren und zweimal feuern. Dies wird mehrere Male abonnieren, wenn Sie mehrmals auf die erste Seite navigieren.
Bitte lassen Sie mich wissen, wenn ich etwas falsch mache.
Sie werden derzeit jedes Mal abonnieren, wenn der Controller geladen wird. Dies geschieht jedes Mal, wenn Sie auf die Seite navigieren. Dies scheint ein einfacher Fall von Tracking zu sein, wenn Sie abonniert sind oder nicht und ein 'if (! Subscribed) 'oder ähnliches verwenden. – Claies
Nun, Sie werden nicht abbestellen, wenn Ihr Controller zerstört wird. Es wird also weiterhin abonniert. Sie haben nicht nur mehrere Konsolenprotokolle, sondern auch ein schönes Speicherleck. –
@JBNizet: Können Sie uns wissen lassen, wie Sie Event mit Mediator js abmelden? –