我有一个模块 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.
}
}
}
}