簡體   English   中英

如何在我的 .forRoot() 中以 angular 初始化第 3 方模塊

[英]how can I initialize a 3rd party module within my .forRoot() in angular

我正在為我們的項目構建一個內部庫,使用 Angular 6+。 我正在使用.forRoot()方法按照文檔注冊全局服務。

我的圖書館將使用ngx-toastr來提供通知。 由於我不希望每個項目都直接處理ngx-toastr所有選項, ngx-toastr我將其中的大部分抽象為notifications服務。

ngx-toastr工作方式是,您可以通過將這些全局選項傳遞給ToastrModule.forRoot()來設置全局選項。

如何將ToastrModule配置為我自己的forRoot()

.forRoot()添加任何代碼顯然是一個壞主意,但是在我的@NgModule()直接初始化它是正確的方法嗎? 像這樣:

@NgModule({
    imports: [ToastrModule.forRoot(/* options go here? */)],
    declarations: [],
    exports: []
})
export class ToolsCoreModule {
    static forRoot(): ModuleWithProviders {
        return {
            ngModule: ToolsCoreModule,
            providers: [],
        };
    }
}

如果團隊中的某個人決定在他們自己的模塊初始化中也調用ToastrModule.forRoot() ,這將如何交互?

通過providers導出通知服務的根模塊應該是唯一一個在imports聲明中使用ToastrModule.forRoot()的模塊。

forRoot()調用是一種約定,而不是框架強制執行的操作。 其他人在定義他們的 NgModules 時不應該調用它,如果它已經被更高層調用了。

正如 Angular 文檔中提到的:

僅在根應用程序模塊AppModule調用並導入.forRoot()結果。 在任何其他模塊中導入它,特別是在延遲加載的模塊中,與意圖相反,並且可能會產生運行時錯誤。

...

forRoot()forChild()是分別在根和功能模塊中配置服務的方法的常規名稱。

如果您對ToastrModule的全局配置從未改變,我認為按照您在代碼片段中提出的問題的方式沒有任何問題。

但是,如果配置可能會根據ToolsCoreModule使用者而發生變化,那么您不應該為每個不同的配置調用forRoot() ,因為按照慣例,這是錯誤的。 在這種情況下,您可以考慮圍繞 toast 調用的第三個參數創建包裝器以傳遞通用配置(例如this.toastrService.error(msg, title, config) )。

正如@migh 所提到的, forRoot()應該只由AppModule ,但是在forRoot()提供者中嵌套的forRoot()仍然由AppModule ,不是嗎?

所以你可以執行以下操作

@NgModule({
    imports: [],
    declarations: [],
    exports: [ToastrModule]
})
export class ToolsCoreModule {
    static forRoot(/* your options */): ModuleWithProviders {
        return {
            ngModule: ToolsCoreModule,
            providers: [...ToastrModule.forRoot(/* toastr options */).providers],
        };
    }
}

如果團隊中的某個人決定在他們自己的模塊初始化中也調用ToastrModule.forRoot() ,這將如何交互?

您可能會收到運行時錯誤或奇怪的行為。

為了避免“奇怪的行為”,您還應該將此模式添加到防止雙重注冊的模塊中:

constructor(@Optional() @SkipSelf() parentModule?: ToolsCoreModule)
{
    if (parentModule)
    {
        throw new Error(
            "ToolsCoreModule is already loaded. Import it in the AppModule only!");
    }
}

該模式來自官方文檔: https : //angular.io/guide/singleton-services#prevent-reimport-of-the-greetingmodule

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM