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

标签 angularjs socket.io

我想在 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);
                    }
                });
            })
        }
    };

它在 Controller 中使用如下:

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

问题是每次访问 Controller 时都会添加另一个监听器,因此当收到消息时,会多次处理该消息。

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

编辑:我知道我可以在工厂中返回任何内容并在那里进行监听,然后在 Controller 中使用 $rootScope.$broadcast 和 $scope.$on ,但这看起来不是一个好的解决方案。

EDIT2:添加到工厂

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

并在每个使用socket.io的 Controller 的开头调用它。

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

最佳答案

每当 Controller 被销毁时,请删除套接字监听器。 您需要像这样绑定(bind) $destroy 事件:

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

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

有关更多信息,请查看 angularjs documentation .

关于angularjs - 改进这个 AngularJS 工厂以与 socket.io 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14389049/

相关文章:

javascript - AngularJS 服务中的 JSDoc

javascript - 如何在 angularjs 中的两个 Controller 之间共享 $scope 属性,而不是其值?

javascript - 在angularjs中将id从一个页面传递到另一个页面

node.js - 如何删除 io.on ('connection' ) 监听器?

javascript - Angular 就绪功能不起作用

javascript - 如何更改指令中元素的 css 类?

node.js - expressjs 和 socket.io - 客户端上的重复消息

ios - pkyeck socket.IO-objc 未向 socket.io 服务器发送事件

javascript - 以编程方式将文件上传到 ownCloud 服务器

node.js - NodeJS : Avoiding race condition with async verifications