1

我有一项服务将我的客户端连接到 Socket.io 服务器:

var serviceSocketIo = angular.module('myApp.services', []);

serviceSocketIo.factory('mySocket',['$rootScope', '$routeParams', function ($rootScope, $routeParams) {
  var base = $rootScope.base, //base = 'http://localhost:3000'
  channel = '/' + $routeParams.game,
  url = base + channel,
  mySocket;

  console.log('service: connection to ' + url);
  mySocket = io.connect(url);
  return {
    base: base,
    channel: channel,
    socket: mySocket,
    on: function (eventName, callback) {
      mySocket.on(eventName, function () {  
        var args = arguments;
        $rootScope.$apply(function () {
          callback.apply(mySocket, args);
        });
      });
    },
    emit: function (eventName, data, callback) {
      mySocket.emit(eventName, data, function () {
        var args = arguments;
        $rootScope.$apply(function () {
          if (callback) {
            callback.apply(mySocket, args);
          }
        });
      })
    }
  };
}]);

请注意,命名空间取决于 $routePrams 参数。

我需要的是在实例化之前从缓存中删除服务。所以我会确保这些服务会将客户端连接到正确的 url。或者是否有其他方法可以强制我的服务检查参数?

4

3 回答 3

1

是什么让您无法创建为您创建套接字的服务?

var services = angular.module('myApp.services', []);

services.service('SocketService', function () {
    var SocketService = function () {
        this.createSocket = function (url) {
            return io.connect(url);
        }
    };

    return SocketService;
});
于 2013-04-30T05:14:03.137 回答
1

角度中的工厂和服务是单例的,没有其他配置可以使它们成为可能。如果你想要这样的控制,你需要在 $provide 对象上使用方法:

使用 app.config 获取提供的访问权限:

app.config(function($provide) {
   // Now you have provide 
});

您可以使用从 $get 返回的内容创建您自己的自定义实例化策略:

$provide.provider('foo', function(){
  this.$get = function(dep) {...}
});

参考:http ://slides.wesalvaro.com/20121113/#/2/6

于 2013-04-30T01:44:30.290 回答
0

服务/工厂方法只运行一次,然后使用返回值。如果要自定义返回的功能,请将这些作为参数放在返回的函数成员中。例如注意你的Arg:

var serviceSocketIo = angular.module('myApp.services', []);

serviceSocketIo.factory('mySocket',['$rootScope', '$routeParams', function ($rootScope, $routeParams) {
  var base = $rootScope.base, //base = 'http://localhost:3000'
  channel = '/' + $routeParams.game,
  url = base + channel,
  mySocket;

  console.log('service: connection to ' + url);
  mySocket = io.connect(url);
  return {
    base: base,
    channel: channel,
    socket: mySocket,
    // Notice yourArg 
    on: function (eventName, callback, yourArg) {
      // Use yourArg to customize behaviour: 
      mySocket.on(eventName, function () {  
        var args = arguments;
        $rootScope.$apply(function () {
          callback.apply(mySocket, args);
        });
      });
    },
    emit: function (eventName, data, callback) {
      mySocket.emit(eventName, data, function () {
        var args = arguments;
        $rootScope.$apply(function () {
          if (callback) {
            callback.apply(mySocket, args);
          }
        });
      })
    }
  };
}]);
于 2013-04-30T00:56:01.760 回答