大多数Angular 2+库(包括ng-bootstrap
)提供了应导入的模块。有时他们有forRoot()
方法,有时没有。
最近,我一直在努力解决因使用NgbDatepickerModule
导入我的应用程序的子模块中的NgbDatepickerModule.forRoot()
而导致的错误...,删除forRoot
解决了这个问题。
我猜forRoot
方法只应在导入模块时调用,该模块是应用程序的入口点,并且还有BrowserModule
?但是模块可以稍后导入子模块,我想这应该在没有forRoot
调用的情况下完成。
为什么呢?通过forRoot
创建模块时模块创建有何不同?
答案 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
]
};
}
}
当您在子模块中也使用此方法时,那些提供程序会被新实例覆盖,这可能会导致意外行为。