如何仅在一个特定的NgModule中添加http拦截器(无延迟加载)?

时间:2019-07-16 18:29:06

标签: angular angular-di

我需要实现一些功能。我想在模块A和B中提供一些HTTP拦截器。我希望模块A的每个HTTP请求都带有一些标头,例如“ zone:a-feature”。来自模块B的任何请求都必须带有标头,例如“ zone:b-feature”。

我正在尝试使用自定义的HTTP拦截器实现这一点。

这是我尝试过的:https://stackblitz.com/edit/angular-j3siwz

  1. 我创建了包含2个组件A和B的2个模块
  2. 每个组件发送请求
  3. 每个模块都有自定义的令牌提供程序
  4. 在http拦截器中,我想注入令牌提供程序。

问题是angular的工作原理:)看起来,通过设计,所有依赖项都在某个“根模块”中提供。因此,当我在B模块中提供“另一个”令牌时,只需在根模块注入器中重写此令牌。

因此,在我的两个请求示例中,我都在控制台日志中收到“ a-feature”消息。拦截器仅用1个令牌值创建一次(下面的文章确切描述了为什么如此)。

看起来像有角度的文档清楚地这样说:https://angular.io/guide/dependency-injection

我还发现并充实了这篇完美的文章:https://blog.angularindepth.com/angular-dependency-injection-and-tree-shakeable-tokens-4588a8f70d5d

看起来,延迟加载的模块工作方式不同。但就我而言,我没有延迟加载,因此无法在我的情况下使用此完美功能。

所以,我的问题是如何在那个复杂的世界中实现我所需要的功能?

我不知道该怎么做。我也尝试过:提供不同的拦截器,使用工厂和其他东西装饰HttpClient。他们中的任何一个都给我相同的结果。

UPD:

我也理解提供程序对象中的multi属性。这样,我可以获得所有模块中提供的所有令牌,但看不到完整的解决方案。我如何能够检测到该数组中的确切令牌应应用于特定的http请求(可以来自任何模块)?

1 个答案:

答案 0 :(得分:0)

您尝试使用“ providedIn:MyModule”语法吗?

来自Angular来源:

export interface Injectable {
  /**
   * Determines which injectors will provide the injectable,
   * by either associating it with an `@NgModule` or other `InjectorType`,
   * or by specifying that this injectable should be provided in one of the following injectors:
   * - 'root' : The application-level injector in most apps.
   * - 'platform' : A special singleton platform injector shared by all
   * applications on the page.
   * - 'any' : Provides a unique instance in every module (including lazy modules) that injects the
   * token.
   *
   */
  providedIn?: Type<any>|'root'|'platform'|'any'|null;
}