gpt4 book ai didi

angular - 如何在功能模块层次结构中使用 .forRoot()

转载 作者:太空狗 更新时间:2023-10-29 16:46:33 27 4
gpt4 key购买 nike

任何人都可以向我说明我应该如何使用 .forRoot() 调用构建多个嵌套的功能模块层次结构?

例如,如果我有这样的模块会怎样:

- MainModule
- SharedModule
- FeatureModuleA
- FeatureModuleA1
- FeatureModuleA2
- FeatureModuleB

所有功能模块都有一个 .forRoot() 静态函数。

我应该如何定义 FeatureModuleA 以某种方式“转移”.forRoot() 函数?

@NgModule({ 
imports: [
//- I can use .forRoot() calls here but this module not the root module
//- I don't need to import sub-modules here, FeatureA only a wrapper
//FeatureModuleA1.forRoot(), //WRONG!
//FeatureModuleA2.forRoot(), //WRONG!
],
exports: [
//I cannot use .forRoot() calls here
FeatureModuleA1,
FeatureModuleA2
]
})
class FeatureModuleA {
static forRoot(): ModuleWithProviders {
return {
//At this point I can set any other class than FeatureModuleA for root
//So lets create a FeatureRootModuleA class: see below!
ngModule: FeatureModuleA //should be: FeatureRootModuleA
};
}
}

我可以为 root 使用创建另一个类,然后在 FeatureModuleA 的 forRoot() 函数中设置它:

@NgModule({
imports: [
//Still don't need any sub module within this feature module
]
exports: [
//Still cannot use .forRoot() calls but still need to export them for root module too:
FeatureModuleA1,
FeatureModuleA2
]
})
class FeatureRootModuleA { }

But how can I "transfer" .forRoot() calls within this special ModuleClass?

如我所见,我需要将所有子模块直接导入我的根 MainModule 并为每个子模块调用 .forRoot():

@NgModule({
imports: [
FeatureModuleA1.forRoot(),
FeatureModuleA2.forRoot(),
FeatureModuleA.forRoot(),
SharedModule.forRoot()
]
})
class MainModule { }

我说的对吗?在你回答之前,请看一下这个文件: https://github.com/angular/material2/blob/master/src/lib/module.ts

据我所知,这个 repo 由官方 angular 团队维护。因此,他们通过在特殊的 MaterialRootModule 模块中导入所有 .forRoot() 调用来解决上述问题。我真的不明白如何将它应用于我自己的根模块? root.forRoot 在这里的真正含义是什么?这是相对于包而不是实际的 Web 项目吗?

最佳答案

一般forRoot用于添加应用/单例服务。

@NgModule({
providers: [ /* DONT ADD HERE */ ]
})
class SharedModule {
static forRoot() {
return {
ngModule: SharedModule,
providers: [ AuthService ]
}
}
}

原因是,如果您将AuthService 添加到@NgModule 中的providers,则可能会创建多个如果您将 SharedModule 导入其他模块。

我不是 100% 清楚当 SharedModule 被导入一个急切加载的模块时是否会创建服务,但是提到的文档的解释是关于延迟加载模块的。当您延迟加载模块时,将创建所有提供程序。

出于这个原因,我们添加了一个(按照约定)forRoot 方法来表示该方法应该只为根(app)模块调用,而对于其他模块应该正常导入

@NgModule({
imports: [SharedModule]
})
class FeatureModule {}

@NgModule({
imports: [SharedModule.forRoot()]
})
class AppModule {}

关于angular - 如何在功能模块层次结构中使用 .forRoot(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39653072/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com