繁体   English   中英

导入带有或不带有forRoot的模块

[英]Importing modules with or without forRoot

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

最近,我在使用NgbDatepickerModule.forRoot()在应用程序的子模块中导入NgbDatepickerModule引起的bug NgbDatepickerModule.forRoot() ,删除forRoot解决了该问题。

我猜forRoot方法只应在导入模块时调用,该模块是应用程序的入口点,并且还具有BrowserModule 但是模块可以稍后导入到子模块,我想应该在没有forRoot调用的情况下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
      ]
    };
  }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM