大多数 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
]
};
}
}
当您在子模块中也使用此方法时,这些提供程序会被新实例覆盖,这可能会导致意外行为。