首页 > 解决方案 > 在模块中使用 forRoot() 方法时,我们是否也必须声明 forChild() 静态方法?

问题描述

当我们创建一个核心模块时,我们创建一个forRoot()静态forChild方法来禁止它提供的提供者被多次实例化。但是,我很困惑forChild()。如果核心模块有一个额外的延迟加载模块注入器的提供者,我们当然也必须声明一个forChild()静态方法。

但是,如果核心模块没有延迟加载模块的注入器提供程序,我们可以使用延迟加载模块来导入核心模块imports: [CoreModule]not usingimports: [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但它没有延迟加载模块的额外提供程序。

标签: angular

解决方案


推荐阅读