首页 > 解决方案 > 如何在我的 .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()如果团队中的某个人决定在他们自己的模块初始化中也调用,这将如何交互?

标签: angulartoastrangular-toastr

解决方案


正如@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


推荐阅读