在模块中使用forRoot()方法时,我们也必须声明forChild()静态方法吗?

时间:2019-02-18 08:10:33

标签: angular

创建核心模块时,我们将创建forRoot()forChild静态方法,以禁止对其提供的提供程序进行多次实例化。但是,我对forChild()感到困惑。如果核心模块为延迟加载的模块的注入器提供了其他提供程序,那么我们当然也必须声明一个forChild()静态方法。

但是,如果核心模块没有延迟加载模块的注入器提供程序,我们是否可以让延迟加载模块仅使用imports: [CoreModule]而不使用imports: [CoreModule.forChild()]来导入核心模块?因为核心模块本身没有声明提供程序,所以我认为延迟加载的模块可以正常导入核心模块。

@NgModule({
  imports: [
    BrowserModule,
    CoreModule.forRoot(), // imports Core Module for root injector
    AppRoutingModule
  ],
  providers: [],
  declarations: [
    AppComponent
  ],
  bootstrap: [AppComponent]
}) export class AppModule { }


@NgModule({
  imports:      [ CommonModule ],
  declarations: [ ButtonComponent ],
  exports:      [ ButtonComponent ],
  providers:    [] // It doesn't have a provider in itself.
}) export class CoreModule {

  // It is using forRoot() to register a provider.
  // But, it doesn't declare forChild().
  static forRoot(config: UserServiceConfig): ModuleWithProviders {
    return {
      ngModule: CoreModule,
      providers: [
        {provide: UserService, useClass: UserServiceImpl }
      ]
    };
  }
}

@NgModule({
  imports: [
    CommonModule,
    CoreModule    // imports core module not using `forChild`
  ],
  declarations: [ ],
  providers:    [ ]
}) export class LazyLoadedModule {}

所以,我的问题是,当我们使用forChild()方法时,不需要声明forRoot()吗?

有关更详细的情况,我建议与RouterModule类似的示例。此模块具有forRoot()forChild。考虑一个像RouterModule这样的模块,但是它没有用于延迟加载模块的其他提供程序。

0 个答案:

没有答案