Angular服务的全球?

时间:2014-08-18 15:00:22

标签: javascript angularjs

我可以定义所有Angular服务模块都可以访问的全局变量或函数吗?

例如,我有几个服务向同一个url根目录的各个端点发出http请求。我希望能够改变这个根。

我的服务模块看起来像这样。

var host = 'http://my-api.com'; 
return {
get: function(id) {
    return $http({
        url: host + '/contacts/' + id,
        method: 'GET'
      });
},
...
switchHost: function(url){
    host = url;
}
});

因此,我可以在控制器中调用ContactService.switchHost('http://new-url')来更新此特定服务。

我希望有一些 Root Service ,我可以全局定义hostswitchHost

注意:此处的用例是我们的一些客户将访问我们的公司API,而其他客户将自行托管其资源。

2 个答案:

答案 0 :(得分:1)

我建议你创建一个拦截器来消化像这样的角度值。

angular.module('...')
.value('HOST', 'http://www.fu.bar.com/')
.factory('InterceptorFactory', function (HOST) {
    return {
        request: function(config) {

            config.url = HOST + config.url;

            return config;
        }
    };
})
.config(['$httpProvider',function($httpProvider) {


    $httpProvider.interceptors.push('InterceptorFactory');
}]);

每当您调用$ http服务时,都会调用工厂并添加您的主机。 如果要更新主机,只需要在任何块中注入值并更新它。

答案 1 :(得分:0)

感谢您的回复。我刚刚做了这样的事情。

angular.module('app.services').factory('RootService', function($http) {
    return {
        switchHost: function(url){
            this.host = url;
        },
        host: 'http://app.apiary-mock.com'
    }
});

这样客户端只需在设置页面上输入一个网址,根目录就会改变,这就是我想要的。