inik23
@inik23
типа разработчик

Почему socket.on('custom event') отрабатывает несколько раз?

Доброго дня всем. Есть небольшой проект на angular + socket.io + nodejs

Приложение имеет всего два маршрута
Пример:
$routeProvider.
        when('/', { 
            templateUrl: '/tpl',
            controller: 'MainCtrl'
        }).
        when('/other', { 
            templateUrl: 'other.tpl',
            controller: 'OtherCtrl'
        }).
            .otherwise({
                redirectTo: '/'
            });


При первой загрузке приложен все работает как положено,
socket.on( 'new user' , function ( data ){
            console.log(1);
            $scope.UserList.push(JSON.parse(data));
});


но когда "походишь" по маршрутам то некоторые функции вызываются по несколько раз.
$scope.UserList.push(JSON.parse(data));
Код выше отработает несколько раз ( все зависит от того сколько раз я менял урл )
К примеру я пять раз сменил урл - 5ть раз сработал push()

socket - вынес в сервис
---------------------------------------
MyApp.factory('socket', ['$rootScope', function ($rootScope) {

    var safeApply = function(scope, fn) {
        if (scope.$$phase) {
            fn();
        } else {
            scope.$apply(fn);
        }
    };

    var socket = io.connect(URL_TO_SOCKET);

    return {
        on: function (eventName, callback) {
            socket.on(eventName, function () {
                var args = arguments;
                safeApply($rootScope, function () {
                    callback.apply(socket, args);
                });
            });
        },
        emit: function (eventName, data, callback) {
            socket.emit(eventName, data, function () {
                var args = arguments;
                safeApply($rootScope, function () {
                    if (callback) {
                        callback.apply(socket, args);
                    }
                });
            })
        },
        disconnect: function () {
            socket.disconnect();
        },
        socket: socket
    };

}]);


Подскажите как решить эту проблему?
  • Вопрос задан
  • 375 просмотров
Решения вопроса 1
AMar4enko
@AMar4enko
Потому что нужно вручную отписываться от события при уничтожении скоупа контроллера. Начните отсюда stackoverflow.com/questions/9418697/how-to-unsubsc...
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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