如何在$ httpProvider中访问服务

时间:2014-04-30 14:49:25

标签: angularjs angularjs-service

我创建了一个配置服务来提供特定于环境的配置。我正在使用$httpProvider拦截并使用API​​ Base Url扩展请求网址,但如何从$httpProvider内访问配置服务?

我已经阅读了$injector,但我不明白如何使用它来解决我的问题。

// pseudo code, not working
app.service('Config', function() {

    // configuration property object

    return {
        get: function (property) {
            return property
        }
    } 
});

app.config(function ($httpProvider, Config) {

    $httpProvider.interceptors.push(function ($q) {
        return {
            'request': function (config) {

                // extend config.url to add a base url to the request
                if (config.url.indexOf('api') !== -1) {
                    config.url = Config.get('root') + config.url;
                }

                return config || $q.when(config);
            }
        }
    });
});

1 个答案:

答案 0 :(得分:3)

更改此行:

app.config(function($httpProvider, Config) {

为:

app.config(function($httpProvider) {

和这一行:

$httpProvider.interceptors.push(function($q) {

为:

$httpProvider.interceptors.push(function($q, Config) {

这是有效的,因为你推送到拦截器的函数本质上是一个角度服务,可以像这样定义:

angular.app('app', [])
  .service('HttpInterceptor', function($q, Config) {
     return {
       request: function() {
         // Do whatever
       }
     };
  });

可以在config函数中传递,如下所示:

$httpProvider.interceptors.push('HttpInterceptor');

只要你的HttpInterceptor服务没有调用$http或依赖$http的任何东西(......如$resource),你就可以了。 @Ye Liu在评论中表示不允许将服务注入配置功能。但是,服务可以注入其他服务。