angular.js $ resource作为具有动态root的“服务”

时间:2014-04-22 10:44:23

标签: javascript angularjs resources

我有一个JS库,我想提供给我的客户,这是基于Angular。 它以下列方式定义了许多服务:

angular.module('Services', [
    'ngResource'
]).factory('UserService', function($resource) {
    return function(whatsonUserId) {
        return $resource('/rest/user/:action');
    }
}. factory ...

要使用我的图书馆,我的客户只需:

app.controller('Ctrl', function(UserService) {
    ...
    UserService().doSomething()
}

当我的客户使用这个库时,他们会在自己的HTML中使用它,这显然是从他们自己的URL加载,使得根URL不适用于MY服务。显然,纠正这种情况的方法是提供$ resource的绝对URL:

        return $resource('www.my.server.url/rest/user/:action');

但我不会只有一个“my.server.url' - 我有几个。我有一个临时环境,我有一个开发环境,我有生产环境 - 有些是每个客户。

我的问题是:我是否可以使用通用的服务'并让我的图书馆用户指定服务器根目录'对于服务' ?

2 个答案:

答案 0 :(得分:4)

这是provider api的一个很好的用例。您可以使用module.provider定义api。为服务器配置定义提供程序,如

module.provider('serverConfig',function() {
    var serverUrl='val';     //default url
    this.setServerUrl=function(url) {
       serverUrl=url;
    };
    this.$get=[function(){
       return {url:serverUrl};
    }];
})

定义此类配置服务后,请在您自己的每项服务中使用它,例如

factory('UserService', function($resource,serverConfig) {
    return function(whatsonUserId) {
        return $resource(serverConfig.url+'/rest/user/:action');
    }

需要在配置阶段配置提供程序

myApp.config(["serverConfigProvider", function(serverConfigProvider) {
  serverConfigProvider.setServerUrl('serverUrlstring');
}]);

答案 1 :(得分:1)

不知道早期版本。但是从AngularJS 1.4.3开始,以下似乎有效:

.factory('UserService', function($resource) {
  // subdomain is defaulted to www
  return $resource("http://:subdomain.my.server.url/rest/user", {subdomain: 'www'});
})

然后,用户可以使用新的子域调用它:

UserService.query({subdomain: 'user001'}).$promise.then(
// => http://user001.my.server.url/rest/user

UserService.query().$promise.then(
// => http://www.my.server.url/rest/user

它是静态的还是动态的...无论如何你喜欢它。