2013-04-30 78 views
1

我有我的客户连接到Socket.io服务器的服务:Angular.js:我如何避免缓存服务?

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 PARAMATERS。

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

回答

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); 
      } 
     }); 
     }) 
    } 
    }; 
}]); 
+0

恐怕这个解决方案不能帮助我,让我更多地解释我的问题:我在我的注射服务两型动物控制器,所以当我的路线相对例如加入到第一控制器,当然,我的服务将我连接到相对于此路线的名称空间,但如果我更改路线,我的服务仍将我连接到相同的路线。这是因为,正如你所说的,服务/工厂方法只运行一次,因此它们被缓存。而且我不知道如何避免这种行为。 – hamou92 2013-04-30 01:16:03

1

工厂和服务在角度上是单身,并且没有其他配置。如果你想这样的控制,你需要使用在$方法提供对象:

可以访问使用的app.config提供:

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

您可以使用它使用的是什么,你自己的自定义实例化策略来创建从$得到回报:

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

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

+0

谢谢。幻灯片很有帮助。 – hamou92 2013-04-30 16:49:45

1

什么让您创建,为您创建套接字服务?

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

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

    return SocketService; 
}); 
+0

谢谢,我试过这样的东西,但使用工厂,它的工作原理。 – hamou92 2013-04-30 16:50:23