5

我想做这样的事情:

angular.module('app', []).config(
  [ '$httpProvider', 'customAuthService',
    ($httpProvider, customAuthService) ->
      $httpProvider.defaults.transformRequest.push (data) ->
        if customAuthService.isLoggedIn
          data['api_key'] = {token: @token}
  ])

根据Angularjs doc,我不能在configmy 的块中执行此操作module,因为那里不允许自定义服务,我也不能在块中执行此操作,因为那里不允许run提供像这样的提供者:$httpProvider

配置块- 在提供者注册和配置阶段执行。只有提供者和常量可以注入到配置块中。这是为了防止在完全配置之前意外实例化服务。

运行块- 在创建注入器后执行并用于启动应用程序。只有实例和常量可以注入运行块。这是为了防止在应用程序运行时进行进一步的系统配置。

如何在$httpProvider依赖自制服务的情况下添加一些配置?

4

2 回答 2

7

始终可以在回调函数中获取注入器,然后获取服务实例(“服务定位器”样式,而不是在配置函数中注入依赖项)。

我想对于特殊情况是可以的,尽管广泛使用它并不好。

.config([ '$httpProvider', function($httpProvider)  {
    $httpProvider.defaults.transformRequest.push(function(data) {

        var $injector = angular.injector(['app']);
        var customAuthService = $injector.get('customAuthService');

        // ...
      });
  }])

但是,与其那样做...

您是否查看过$http文档中的响应拦截器?

它看起来更适合身份验证目的,您可以在那里注入服务。

于 2013-05-07T08:59:36.053 回答
0

据我所知,您可以将其注入到配置中的函数中。如果他们没有使用我的身份验证服务登录,我会使用类似的东西来拦截请求。

.config(['$httpProvider',function ($httpProvider) {
    var authRequest= ['customAuthService', function(customAuthService) {
       if(customAuthService.isLoggedIn){
           data['api_key'] = {token: @token};
       }  
    }];
    $httpProvider.defaults.transformRequest.push(authRequest);
}]);
于 2013-05-07T03:51:48.000 回答