2
を実行しています以前のすべてのインスタンスが実行中のコントローラの新しいインスタンス 更新の際にサーバーからデータを取得するために、私のコントローラにSocket.IOリスナーがあります。新しいルートをロードした後、コントローラの古いインスタンスは、まだ私はパラメータに基づいてページをロードしているルートを持っている
を実行しています以前のすべてのインスタンスが実行中のコントローラの新しいインスタンス 更新の際にサーバーからデータを取得するために、私のコントローラにSocket.IOリスナーがあります。新しいルートをロードした後、コントローラの古いインスタンスは、まだ私はパラメータに基づいてページをロードしているルートを持っている
他の人が同じ問題を抱えている場合、私はSocket.IOを使用していました。リスナーはまだ実行されていましたので、removeListener、removeListenerEvent、offと同じメソッドであるremoveAllListenersというソケットエミッタメソッドを追加しました。 "$ destroy"イベントが発生すると、メソッドに引数を渡すだけですべてのリスナーが削除されます。または、イベントの名前、またはイベントの名前を記述して特定のハンドラを指定して特定のイベントを削除できます。ハンドラ関数の名前。
以下はSocke.IOソースのコードです!
Emitter.prototype.off =
Emitter.prototype.removeListener =
Emitter.prototype.removeAllListeners =
Emitter.prototype.removeEventListener = function(event, fn)
、これは私が私のサービスに必要なすべてのメソッドを渡す方法です:
.factory('socketio', ["$rootScope", function ($rootScope) {
var socket = io.connect();
console.log(socket);
return {
on : function (eventName, callback) {
socket.on(eventName, function() {
var args = arguments;
$rootScope.$apply(function() {
callback.apply(socket, args);
});
});
},
removeAllListeners : function (eventName, callback) {
socket.removeAllListeners(eventName, callback);
},
emit : function (eventName, data, callback) {
socket.emit(eventName, data, function() {
var args = arguments;
$rootScope.apply(function() {
if (callback)
callback.apply(socket, args);
});
});
}
};
}
]);
はあなたがちょうどあなたのsocket.ioリスナーをクリーンアップする必要はありませんか?スコープ上のdestroyイベントをリスンすると、そこにあるリスナーをきれいにすることができます:) '$ scope '$ on(' destroy '、function(/ *あなたのリスナーをここで閉じる* /){ }); ' –
問題は、破壊イベントが発生しないことです – Babak
他のコントローラインスタンスはどのように動作していますか? –