小编典典

改进此AngularJS工厂以与socket.io一起使用

angularjs

我想在AngularJS中使用socket.io。我找到了以下工厂:

app.factory('socket', 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);
                    }
                });
            })
        }
    };

它在控制器中的使用方式如下:

function MyCtrl($scope, socket) {
    socket.on('message', function(data) {
        ...
    });
};

问题是每次访问控制器时都会添加另一个侦听器,因此当收到一条消息时,将对其进行多次处理。

将socket.io与AngularJS集成的更好的策略是什么?

编辑:我知道我无法在工厂返回任何东西并在那里进行监听,然后在控制器中使用$ rootScope。$ broadcast和$ scope。$
on,但这看起来不是一个好的解决方案。

EDIT2:添加到工厂

init: function() {
            socket.removeAllListeners();
}

并在每个使用socket.io的控制器的开头调用它。

仍然感觉不是最好的解决方案。


阅读 224

收藏
2020-07-04

共1个答案

小编典典

销毁控制器时,请删除套接字侦听器。您将需要$destroy像这样绑定事件:

function MyCtrl($scope, socket) {
    socket.on('message', function(data) {
        ...
    });

    $scope.$on('$destroy', function (event) {
        socket.removeAllListeners();
        // or something like
        // socket.removeListener(this);
    });
};

有关更多信息,请查看angularjs文档

2020-07-04