angular - 如何在我的 .forRoot() 中以角度初始化第 3 方模块
问题描述
我正在为我们的项目构建一个内部库,使用 Angular 6+。我正在使用该.forRoot()
方法来注册记录的全球服务。
我的图书馆将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()
如果团队中的某个人决定在他们自己的模块初始化中也调用,这将如何交互?
解决方案
正如@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
推荐阅读
- android-things - 有什么方法可以识别连接到覆盆子的多个 USB-uart 设备?
- mysql - 如何将带有西班牙字符(á、é、í、ó、ú、ñ)的 CSV 文件 utf-8 导入到 phpmyadmin 中的表格中
- laravel - 从 Laravel 中的 .env 获取 .data 到 Laravel Nova Card - vue 组件
- r - 重新排序相关矩阵的列和行以匹配数值向量
- reactjs - 如何将样式化组件与动态导入一起使用
- angular - 如何在 Angular 中实现 facebook 像素?
- prolog - 在列表中的 1 和 0 之间切换
- c# - 错误:无法从 .NET Framework 控制台应用程序使用的 .NET 标准库加载文件或程序集“Microsoft.Win32Registry”
- active-directory - Samba AD 是否支持基于资源的约束委派?
- d3.js - 我如何使这个旭日形开始与内环消耗图表的整个直径?