2017-11-10 2 views
0

Die meisten Angular 2+ Bibliotheken, einschließlich ng-bootstrap, stellen Module bereit, die importiert werden sollen. Manchmal haben sie forRoot() Methode, manchmal nicht.Importieren von Modulen mit oder ohne forRoot

Vor kurzem wurde ich mit einem Fehler verursacht zu kämpfen, indem ein NgbDatepickerModule in Submodul von meiner Anwendung mit NgbDatepickerModule.forRoot() importieren ..., Entfernen forRoot das Problem gelöst.

Ich denke, forRoot Methode sollte nur aufgerufen werden, wenn Modul zu importieren, die Eintrittspunkt zur Anwendung ist und hat auch BrowserModule? Aber Module können später in Submodule importiert werden, was ich denke, sollte ohne forRoot Aufruf erfolgen.

Warum? Was ist der Unterschied bei der Modulerstellung, wenn das Modul über forRoot erstellt wird oder nicht?

Antwort

2

.forFoot() Die Methode wird manuell von den Entwicklern der Module erstellt und soll nur einmal beim Import von Hauptmodulen verwendet werden. Diese Methode soll ModuleWithProviders zurückkehren, was ist:

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

Sie, dass im Falle von NgbDatepickerModule sehen es sieht so aus:

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

Wenn Sie diese Methode verwendet, auch in einem Submodul, dann die Anbieter wurden von neuen Instanzen überschrieben, was zu unerwartetem Verhalten führen kann.

Verwandte Themen