[英]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 時不應該調用它,如果它已經被更高層調用了。
僅在根應用程序模塊
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.