加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

改进这个AngularJS工厂与socket.io一起使用

发布时间:2020-12-17 09:01:39 所属栏目:安全 来源:网络整理
导读:我想在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.$ap
我想在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,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的控制器的开头调用它。

仍然不觉得像最好的解决方案。

每当控制器销毁时删除套接字侦听器。
你将需要绑定$ destroy事件像这样:
function MyCtrl($scope,function(data) {
        ...
    });

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

有关详细信息,请检查angularjs documentation。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读