Angular 是功能模块';哪里都可以看到?

Angular 是功能模块';哪里都可以看到?,angular,Angular,表示在模块级别声明的提供程序对整个应用程序可见: @NgModule.Providers中列出的提供程序具有引导模块的应用范围。将服务提供者添加到@NgModule.providers可以有效地将服务发布到整个应用程序 因此,这意味着来自一个模块(AAAModule)的服务可以注入到另一个模块(BBBModule)。但是,其他人说,我们可以通过在@NgModule中声明提供程序,将提供程序的范围限制到特定模块: 您可以使用非根NgModule的ProviderIn元数据选项在模块级别配置提供程序

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

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

因此,这意味着来自一个模块(
AAAModule
)的服务可以注入到另一个模块(
BBBModule
)。但是,其他人说,我们可以通过在
@NgModule
中声明提供程序,将提供程序的范围限制到特定模块:

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

同样,他说我们可以将提供者的范围限制在特定组件上:

NGO模块内的各个部件都有自己的喷油器。通过使用@component元数据在组件级别配置提供程序,可以将提供程序的范围限制为组件及其子级


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

我认为在你的理解中,导致你困惑的缺失部分是Angular's。延迟加载的模块将有自己的注入器(但继承自根注入器)。因此,延迟加载的模块中列出的提供程序将限定在该模块的范围内,并且只在映射到该模块的路由中存在

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

组件中列出的提供程序的有效期仅与该组件的有效期相同。例如,考虑一个列出提供者的组件,并在可以被切换的<代码> *NGIF < /代码>中。创建组件时,也就是创建提供程序的时候。当组件被销毁时,提供者也会被销毁。提供程序只能在该组件、任何组件/指令以及它们列出的提供程序(它们是DOM树中的子体)中访问

考虑以下示例:

  • 模块A导入到AppModule中

    • 模块A中列出的提供程序位于根注入器中。这意味着提供商可以在整个应用程序中使用,并且可以在应用程序的整个生命周期中使用
  • 模块B被延迟加载

    • 创建子注入器。模块B中列出的提供程序或导入模块B的任何模块中列出的提供程序将驻留在该新喷油器中
到目前为止,我只讨论了模块文件中列出的提供者。然后是最近的使用习惯(从第6章开始)。我建议你看一看。虽然本文讨论了在模块中列出提供程序的旧方法与在中使用
providedIn的新方法,但我认为这可能有助于您理解提供程序的可用范围

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

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

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

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

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

NGO模块内的各个部件都有自己的喷油器。你 可以通过以下方式将提供程序的范围限制为组件及其子组件: 使用@component在组件级别配置提供程序 元数据


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

因此,只有在使用延迟加载时,才会应用此操作(“您可以使用非根NgModule的ProviderIn元数据选项在模块级配置提供程序,以便将提供程序的范围限制到该模块。”)。我试图找到一个更有用的参考:)模块没有自己的注入器,除非模块延迟加载。我会尽量扩大我的答案,让它更清楚。