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