我想在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,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,function(data) {
- ...
- });
- $scope.$on('$destroy',function (event) {
- socket.removeAllListeners();
- // or something like
- // socket.removeListener(this);
- });
- };
有关详细信息,请检查angularjs documentation。