gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 06:00:16 27 4
gpt4 key购买 nike

我想在 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com