【问题标题】:Is it possible to inject provider into the service in AngularJs?是否可以将提供程序注入 AngularJs 中的服务?
【发布时间】:2015-08-20 17:39:22
【问题描述】:

我正在为 http 查询实现自定义拦截器。它需要访问 $httpProvider 中定义的默认标头。

是否可以将 $httpProvider(不是 $http 的实例,因为这会导致循环引用)作为依赖项注入到拦截器工厂中?

【问题讨论】:

  • 您是否尝试将另一个服务调用到拦截器中?

标签: angularjs


【解决方案1】:

不,你不能。

提供者是向您返回工厂/服务/任何功能的对象,并且在您的工厂创建之前运行。

事实上是这样的:

  1. 创建应用程序
  2. 附加/定义您的服务
  3. 配置步骤(您可以在其中注入常量和提供程序)
  4. 运行步骤(您可以在其中注入其他所有内容),最后创建实例,并且您拥有无法更改配置的工厂实例,因为它已经完成并且$http 已经创建并且是不可变的。

简而言之:在生成所有实例之前,您只能在引导程序 .config() 块中注入提供程序。

【讨论】:

    【解决方案2】:

    您可以改为注入$injector

    .factory("MyInterceptor", ["$injector",
    function($injector) {
    
      return {
    
        response /* or any other */: function(response) {
    
          var $http = $injector.get("$http");
          // here, you have access to $http.defaults.headers,
          // see https://docs.angularjs.org/api/ng/service/$http#setting-http-headers
    
          return response;
        }
    
      };
    
    }])
    

    然后,在一些.config() 块中:

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

    【讨论】:

    • 我不需要 $http 的实例。它解决了所有注册的拦截器,包括我自己创建的拦截器。因此将获得循环引用。为了避免这种情况,我尝试注入 $httpProvider ,它不会解决对拦截器的依赖。
    • @PavelPykhtin 你不会得到循环引用,看我的编辑(我的第一个答案不是很详细:))。
    • 现在我明白你的意思了。是的,这应该有效。谢谢!
    猜你喜欢
    • 2018-10-20
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    • 1970-01-01
    • 2017-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多