После загрузки нового маршрута старые экземпляры контроллера все еще работают

У меня есть маршрут, который загружает страницу на основе параметров:

.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);
                    });
                });

            }

        };

    }
]);
Другие вопросы по тегам