代码之家  ›  专栏  ›  技术社区  ›  Sharikov Vladislav

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

  •  0
  • Sharikov Vladislav  · 技术社区  · 5 年前

    我需要实现一些特性。我希望在模块A和B中提供一些http拦截器。我希望来自模块A的每个http请求都发送一些头,比如“zone:A-feature”。来自模块B的任何请求都必须使用类似“区域:B-功能”的标题发送。

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

    https://stackblitz.com/edit/angular-j3siwz

    1. 每个组件发送请求

    因此,在我的示例中,在这两个请求中,我都在控制台日志中获得了“a-feature”消息。拦截器只创建了一次,具有1个令牌值(下面的文章详细描述了行为如此的原因)。

    看起来angular docs清楚地说明了这一点: https://angular.io/guide/dependency-injection

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

    看起来,延迟加载模块的工作方式不同。但是在我的例子中,我没有延迟加载,所以我不能在我的例子中使用这个完美的特性。

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

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

    UPD:

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

    0 回复  |  直到 5 年前
        1
  •  0
  •   Karlatt Itude    5 年前

    您是否尝试过“providedIn:MyModule”语法?

    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;
    }
    
    推荐文章