我有一个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' - 我有几个。我有一个临时环境,我有一个开发环境,我有生产环境 - 有些是每个客户。
我的问题是:我是否可以使用通用的服务'并让我的图书馆用户指定服务器根目录'对于服务' ?
答案 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
它是静态的还是动态的...无论如何你喜欢它。