【问题标题】:Angular: Mixing provider and custom service in module's config/runAngular:在模块的配置/运行中混合提供者和自定义服务
【发布时间】:2013-04-30 22:02:10
【问题描述】:

我想做这样的事情:

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

根据Angularjs doc,我不能在我的moduleconfig 块中执行此操作,因为那里不允许自定义服务,我也不能在run 块中执行此操作,因为提供商喜欢$httpProvider 不允许在那里:

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

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

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

【问题讨论】:

    标签: javascript angularjs angularjs-service


    【解决方案1】:

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

    我想在特殊情况下是可以的,虽然不能很好地广泛使用它。

    .config([ '$httpProvider', function($httpProvider)  {
        $httpProvider.defaults.transformRequest.push(function(data) {
    
            var $injector = angular.injector(['app']);
            var customAuthService = $injector.get('customAuthService');
    
            // ...
          });
      }])
    

    但是,与其那样做...

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

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

    【讨论】:

    • 我最终配置了$http 而不是$httpProvider,就我的用例而言,它提供了完全相同的值。谢谢。
    • 任何方式使用angular.injector 并获得将由您调用config(...) 方法的模块使用的相同服务实例?
    【解决方案2】:

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

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

    【讨论】:

    • 不起作用,读取请求转换器的方法期待回调,而不是数组,所以我得到一个TypeError: object is not a function
    猜你喜欢
    • 2013-06-23
    • 2017-07-16
    • 2020-06-23
    • 1970-01-01
    • 2013-11-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多