使用或不使用forRoot导入模块

时间:2017-11-10 15:03:40

标签: angular

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

最近,我一直在努力解决因使用NgbDatepickerModule导入我的应用程序的子模块中的NgbDatepickerModule.forRoot()而导致的错误...,删除forRoot解决了这个问题。

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

为什么呢?通过forRoot创建模块时模块创建有何不同?

1 个答案:

答案 0 :(得分:2)

.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
      ]
    };
  }
}

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