evd1ser
@evd1ser
fullstac разработчик знаю много умею чуть меньше))

Как избавиться от множественного вызова фабрики в контроллере AngularJS при использовании router?

Добрый день, есть фабрика:
app.factory('socketio', ['$rootScope', function ($rootScope) {
    var socket = io.connect('/');
    return {
        on: function (eventName, callback) {
            socket.on(eventName, function () {
                var args = arguments;
                $rootScope.$apply(function () {
                    callback.apply(socket, args);
                });
            });
        },
        emit: function (eventName, data, callback) {
            socket.emit(eventName, data, function () {
                var args = arguments;
                $rootScope.$apply(function () {
                    if (callback) {
                        callback.apply(socket, args);
                    }
                });
            })
        }
    };
}]);

Она подключается в контроллер который привязан к роутеру, тоесть при переключении вкладок создается множественный вызов фабрики, и обработчики на событие срабатывают пропорциональное количество раз
app.controller("some_controller", [
    'socketio',
    function (socketio) {
        var self = this;
        socketio.emit('load_data',{});
        socketio.on('load_data', function (data) {
                // срабатывает пропорцианально открытию роута
                console.log(data);
        });
    }
]);


Подскажите пожалуйста, как при переключении вкладок разрушать слушатель события чтобы не дублировались вызовы?
  • Вопрос задан
  • 180 просмотров
Решения вопроса 1
evd1ser
@evd1ser Автор вопроса
fullstac разработчик знаю много умею чуть меньше))
В общем получилось вылечить библиотекой https://github.com/btford/angular-socket-io и удалением при дестрое, код может кому пригодится:
app.controller("some_controller", [
    'angular-socket-io',
    '$scope',
    function (socketio, $scope) {
        var self = this;
        socketio.emit('load_data',{});
        socketio.on('load_data', function (data) {
                console.log(data);
        });
        $scope.$on('$destroy', function () {
            socket.removeListener('load_data');
        });

    }
]);

2 вариант добавить в исходную фабрику метод removeListener (подсмотрено в библиотеке angular-socket-io) и вызывать его вместо подключения библиотеки
removeListener: function (ev, fn) {
            if (fn && fn.__ng) {
                arguments[1] = fn.__ng;
            }
            return socket.removeListener.apply(socket, arguments);
        }

При разрушении вида удаляется обработчик с события =) всем спасибо
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы