导入带或不带 forRoot 的模块



大多数 Angular 2+ 库(包括 ng-bootstrap(都提供了应该导入的模块。有时他们有forRoot()方法,有时没有。

最近,我一直在努力解决一个错误,该错误是由于使用NgbDatepickerModule.forRoot()...在应用程序的子模块中导入NgbDatepickerModule引起的,删除forRoot解决了该问题。

我想forRoot方法应该只在导入模块时才调用,模块是应用程序的入口点并且也有BrowserModule?但是模块可以稍后导入到子模块,我想这应该在没有调用的情况下完成forRoot

为什么?通过forRoot创建模块时,模块创建有什么区别?

.forFoot()方法由模块的开发人员手动创建,旨在在主模块导入中仅使用一次。此方法应该返回ModuleWithProviders,即:

export interface ModuleWithProviders {
    ngModule: Type<any>;
    providers?: Provider[];
}

您可以看到,在NgbDatepickerModule的情况下,它看起来像这样:

export class NgbDatepickerModule {
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: NgbDatepickerModule,
      providers: [
        {provide: NgbCalendar, useClass: NgbCalendarGregorian},
        {provide: NgbDatepickerI18n, useClass: NgbDatepickerI18nDefault},
        {provide: NgbDateParserFormatter, useClass: NgbDateISOParserFormatter}, NgbDatepickerConfig
      ]
    };
  }
}

当您在子模块中也使用此方法时,这些提供程序会被新实例覆盖,这可能会导致意外行为。

最新更新