2017-11-10 15 views
0

ng-bootstrapを含むAngular 2+ライブラリのほとんどは、インポートする必要のあるモジュールを提供します。場合によってはforRoot()メソッドを持つこともあります。forRootの有無にかかわらずモジュールをインポートする

最近、NgbDatepickerModule.forRoot() ...を使用してアプリケーションのサブモジュールにNgbDatepickerModuleをインポートすることによって発生したバグに苦労していましたが、forRootを削除すると問題が解決しました。

私はforRootメソッドは、アプリケーションへのエントリポイントであるモジュールをインポートするときにのみ呼び出されるべきであり、またBrowserModuleを持っていると思いますか?しかし、モジュールは後でサブモジュールにインポートすることができます。私はforRoot呼び出しを行わずに行うべきだと思います。

なぜですか? forRootでモジュールを作成したときのモジュール作成の違いは?

答えて

2

.forFoot()メソッドは、モジュールの開発者が手動で作成し、メインモジュールのインポートで一度だけ使用することを意図しています。

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

あなたがそれらそして、サブモジュールでも、この方法を使用する場合:

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

あなたはNgbDatepickerModuleの場合には、それはこのように見えることがわかります。このメソッドは何であるか、ModuleWithProvidersを返すことになっていますプロバイダーが新しいインスタンスによってオーバーライドされ、予期しない動作につながる可能性があります。

関連する問題