我想在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的控制器的开头调用它。
仍然感觉不是最好的解决方案。
销毁控制器时,请删除套接字侦听器。您将需要$destroy像这样绑定事件:
$destroy
function MyCtrl($scope, socket) { socket.on('message', function(data) { ... }); $scope.$on('$destroy', function (event) { socket.removeAllListeners(); // or something like // socket.removeListener(this); }); };
有关更多信息,请查看angularjs文档。