angular - 在模块中使用 forRoot() 方法时,我们是否也必须声明 forChild() 静态方法?
问题描述
当我们创建一个核心模块时,我们创建一个forRoot()
静态forChild
方法来禁止它提供的提供者被多次实例化。但是,我很困惑forChild()
。如果核心模块有一个额外的延迟加载模块注入器的提供者,我们当然也必须声明一个forChild()
静态方法。
但是,如果核心模块没有延迟加载模块的注入器提供程序,我们可以使用延迟加载模块来导入核心模块imports: [CoreModule]
not usingimports: [CoreModule.forChild()]
吗?因为核心模块本身并没有声明提供者,所以我认为延迟加载模块通常可以导入核心模块。
@NgModule({
imports: [
BrowserModule,
CoreModule.forRoot(), // imports Core Module for root injector
AppRoutingModule
],
providers: [],
declarations: [
AppComponent
],
bootstrap: [AppComponent]
}) export class AppModule { }
@NgModule({
imports: [ CommonModule ],
declarations: [ ButtonComponent ],
exports: [ ButtonComponent ],
providers: [] // It doesn't have a provider in itself.
}) export class CoreModule {
// It is using forRoot() to register a provider.
// But, it doesn't declare forChild().
static forRoot(config: UserServiceConfig): ModuleWithProviders {
return {
ngModule: CoreModule,
providers: [
{provide: UserService, useClass: UserServiceImpl }
]
};
}
}
@NgModule({
imports: [
CommonModule,
CoreModule // imports core module not using `forChild`
],
declarations: [ ],
providers: [ ]
}) export class LazyLoadedModule {}
forChild()
所以,我的问题是我们使用forRoot()
方法时不需要声明吗?
对于更详细的情况,我建议使用类似的示例RouterModule
。该模块具有forRoot()
以及forChild
. 想想一个模块,RouterModule
但它没有延迟加载模块的额外提供程序。
解决方案
推荐阅读
- c# - 如何避免注册表修改以在 WinForm C# 中嵌入 excel
- java - Java - JUnit - 在子类中执行 @Test 注释
- autodesk-forge - 如何在不手动单击的情况下选择/缩放对象
- r - 在 r 中进行所有排列组合的函数
- python - 从 Dataframe 中提取不同的值并将它们插入到具有相同列名的新 Dataframe 中
- python - 如何使列表中的列与列表中最长的字符串一样长?
- julia - 比较 Julia 中的 2 个数据帧是否相同
- perl - 从 perl DBI 执行中抑制 stderr
- amazon-web-services - 如何在 API 网关中设置 Stage 以使资源在不同阶段指向不同的 lambda
- flutter - Flutter bloc 模式结构问题(从 Ui Provider 发送表单数据)