私はアプリケーションのために働いています。Angular jをサードパーティのjsライブラリと通信したいと思います。このために、私はmediator jsを使ってpubsubメソッドを使用しました。しかし、私がイベントを購読するとき、これにより複数回購読するので、イベントを公開するときに複数回発生します。Angular 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をテストするには:
- 実行plunker。
- 開発者コンソールを開きます。火災イベント
上の最初のページに
私が間違っているかどうか教えてください。
コントローラがロードされるたびに、ページに移動するたびにサブスクライブする予定です。これは、あなたが購読しているかどうかを追跡し、 'if(!subscribed)'などを使って追跡する単純なケースのようです。 – Claies
さて、コントローラが破棄されたときには、登録を解除していません。だからそれは購読され続ける。あなたは複数のコンソールログを持っているだけでなく、素敵なメモリリークも持っています。 –
@JBNizet:メディエータjsを使用してイベントの登録を解除する方法をお知らせください。 –