代码之家  ›  专栏  ›  技术社区  ›  rosshjb

功能模块的提供者是否随处可见?

  •  2
  • rosshjb  · 技术社区  · 7 年前

    Angular document 表示在模块级别声明的提供程序对整个应用程序可见:

    @NgModule.Providers中列出的提供程序具有引导模块的应用范围。将服务提供者添加到@NgModule.providers可以有效地将服务发布到整个应用程序。

    AAAModule BBBModule ).但是,其他 Angular document 表示我们可以通过在声明提供程序来将提供程序的范围限制为特定模块 @NgModule :

    another document 表示我们可以将提供程序的范围限制为特定组件:

    那么,事实是什么?如果我在模块级声明一个提供者,它对整个应用程序或模块可见吗?“范围”仅指提供者的“生存期”?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Sam Herrmann    7 年前

    我认为在你的理解中,导致你困惑的缺失部分是Angular的 lazy loading feature

    当模块导入到其他模块中(非延迟加载)时,这些模块中列出的所有提供程序将合并到同一个注入器中。这些提供程序将在整个应用程序生命周期内有效。

    *ngIf 这是可以切换的。创建组件时,也就是创建提供程序的时候。当组件被销毁时,提供者也会被销毁。提供程序只能在该组件、任何组件/指令以及它们列出的提供程序(它们是DOM树中的子体)中访问。

    考虑下面的例子:

      • 模块A中列出的提供程序位于根注入器中。这意味着提供商可以在整个应用程序中使用,并且可以在应用程序的整个生命周期中使用。
      • 创建子注入器。模块B中列出的提供程序或导入模块B的任何模块中列出的提供程序将驻留在该新喷油器中。

    到目前为止,我只讨论了模块文件中列出的提供者。然后是最近的使用习惯(从第6章开始) providedIn in the @Injectable decorator this article . 本文讨论了在模块中列出提供者的旧方法与使用 提供 ,我认为这可能会帮助您了解提供商的可用范围。

        2
  •  0
  •   Fullstack Guy    7 年前

    providers 数组,则范围是整个应用程序。它与根注入器关联,使相同的单例实例在应用程序中可用。如果在功能模块中声明了提供程序,则除非导入该模块,否则该提供程序将不可用。但是如果在 到处都有。

    您可以使用非根NgModule的ProviderIn元数据选项在模块级别配置提供程序,以便将提供程序的范围限制到该模块。

    @Injectable 并在 providedIn 属性,则只有那些正在导入声明服务的模块的模块才能获得该实例。这将启用树抖动,这本质上意味着如果应用程序中未使用提供程序代码,则将其从最终捆绑包中排除。

    对于延迟加载的模块,将创建根注入器的另一个子级,该子级将复制根注入器中的所有内容以及延迟模块中声明的提供程序。在惰性加载组件的上下文中,提供程序从这个子注入器注入,而不是从根注入器注入。

    NGO模块内的各个部件都有自己的喷油器。你 使用@component在组件级别配置提供程序 元数据。

    在这种情况下,每个组件都将获得自己的提供程序副本,该副本与根注入器中配置的实例不同。当您需要不希望跨组件共享的提供程序的私有副本时,请执行此操作。

    推荐文章