我想在 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 的控制器的开头调用它。
仍然感觉不是最好的解决方案。