После загрузки нового маршрута старые экземпляры контроллера все еще работают
У меня есть маршрут, который загружает страницу на основе параметров:
.when('/:num/:den', {
templateUrl : 'app/views/templates/home.html',
controller :"ProductContoller",
controllerAs: "product",
reloadOnSearch : false });
Проблема в том, что каждый раз, когда я перезагружаю маршрут, появляется новый экземпляр контроллера вместе со всеми предыдущими экземплярами, все еще работающими. В моем контроллере есть слушатели Socket.IO для получения данных с сервера в случае любого обновления.
1 ответ
В случае, если у кого-то еще возникла такая же проблема, я использовал Socket.IO, и его слушатели все еще работали, поэтому я добавил метод Emitter сокета, removeAllListeners, который является тем же методом, что и removeListener, removeListenerEvent и off. Теперь, когда я получаю событие "$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);
});
});
}
};
}
]);