Angular:在模块的配置/运行中混合提供者和自定义服务

时间:2013-05-07 03:32:18

标签: javascript angularjs angularjs-service

我想做那样的somtehing:

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

根据Angularjs doc,我无法在config的{​​{1}}块中执行此操作,因为不允许自定义服务,也不能在module中执行此操作1}}阻止,因为那里不允许像run这样的提供者:

  

配置块 - 在提供商注册和配置阶段执行。只有提供程序和常量才能注入配置块。这是为了防止服务在完全配置之前意外实例化。

     

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

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

2 个答案:

答案 0 :(得分:7)

总是可以获得一个注入器,然后获得回调函数内的服务实例('service locator'样式,而不是在config函数中注入依赖项)。

我认为对于特殊情况是好的,尽管不能广泛使用它。

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

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

        // ...
      });
  }])

但是,而不是这样做......

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

它看起来更适合身份验证用户,你可以在那里注入服务。

答案 1 :(得分:0)

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

.config(['$httpProvider',function ($httpProvider) {
    var authRequest= ['customAuthService', function(customAuthService) {
       if(customAuthService.isLoggedIn){
           data['api_key'] = {token: @token};
       }  
    }];
    $httpProvider.defaults.transformRequest.push(authRequest);
}]);