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

angular のファクトリとサービスはシングルトンであり、それ以外の構成はありません。このような制御が必要な場合は、$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

サービス / ファクトリ メソッドは 1 回だけ実行され、その時点から戻り値が使用されます。返すものの機能をカスタマイズしたい場合は、これらを引数として、返すものの関数メンバーに入れます。たとえば、yourArg に注目してください:

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 に答える