0

我有一个模块 LoginModule,需要为其提供一些配置,因此它提供了 forRoot。我在我的 AppModule 中使用了这个 forRoot()。现在我有另一个模块Module2,它本身是由AppModule 导入的。我需要Module2中LoginModule的一个组件,所以Module2需要导入LoginModule。但是它应该怎么做呢?

似乎无论我做什么,LoginModule 构造函数都会被调用两次,如果 Module2 导入 LoginModule:一次是通过 AppModule 中的 forRoot(),一次用于在 Module2 中导入。我尝试在 Module2 中使用 forChild 模式进行导入,但这并没有改变任何东西。因为我想在创建 LoginModule 时运行一些初始化代码,所以我设置了下面显示的解决方案来检测 LoginModule 是否是根模块。

我的印象是,在使用 forChild 之类的东西时根本不应该有第二个 LoginModule。我错了吗?还是我犯了一个错误,导致第二个 LoginModule 不应该存在?

@NgModule({
    declarations: [
// some things are declared
    ],
    imports: [
// various imports
    ],
    exports: [
// some exported components exist
    ]
})
export class LoginModule {
// forRoot is used to inject a configuration into the module
// LoginModule.forRoot() is used in the AppModule of my app.
    static forRoot(config: UserSystemConfig): ModuleWithProviders<LoginModule> {
        return {
            ngModule: LoginModule,
            providers: [
                LoginService,
                LoginAuthGuard, 
                {
                    provide: libConf, // an injection token
                    useValue: config
                },
                {
                    provide: mKey, // an injection token
                    useValue: true
                }
            ],
        }
    }
// forChild skips providing anything but the key that I use to know if this is the root instance.
    static forChild(): ModuleWithProviders<LoginModule> {
        return {
            ngModule: LoginModule,
            providers: [{
                provide: mKey,
                useValue: false
            }]
        }
    }

    constructor(@Inject(mKey) isRoot: boolean) {
        if (isRoot) {
// Run initialization for the module only in root module.
        }
    }
}
}
4

1 回答 1

1

forRoot()forChild()帮助您管理您的服务。它与模块的代码是否执行无关。每次使用时都会执行。如果不执行它就没有意义。

当您使用forRoot()并且如果模块是延迟加载的(使用它自己的注入器),它的提供者将是根注入器中提供者的相同实例。否则模块将实例化它自己的提供者实例。

于 2021-02-02T15:00:52.910 回答