我正在尝试配置我的应用程序以使用rc5中的延迟加载模块。这就是我遇到的问题。
我有一个使用RouterModule.forChild(router)
并得到延迟加载的模块,我们称它为levelonemodule。这个模块也有几个延迟加载的模块,我们称它们为leveltwomodule-s。这在很大程度上起作用,但我必须解决以下问题:
我在我的levelonemodule中提供了一个服务,我需要在leveltwommodule-s中将其作为一个单例,但是由于某些原因,每个leveltwommodule都有自己的服务实例。
下面是一个代码示例:
一级模块
@NgModule({
imports: [
SharedModule,
levelOneRouter
],
providers: [SomeService],
declarations: [...]
})
二级模块:
@NgModule({
imports: [
SharedModule,
levelTwoRouter
],
providers: [],
declarations: [...]
})
我希望levelonemodule注册一些声明,我需要这些声明在多个leveltwomule-s中可用,我不知道如何实现这一点。
如果我只是尝试在levelonemodule中注册声明:
declarations: [SomeComponent, ANotherComponent]
我得到了无法识别的元素错误,如果我试图在每个leveltwommodule中分别注册声明,就会得到
is part of the declarations of 2 modules
错误。我还试图为levelonemodule创建另一个sharedmodule,但这也不起作用。
任何帮助或信息都是非常感谢的,只是一些东西给我指出了正确的方向。
最佳答案
问题1的答案
您应该要求LevelOneModule
注册singleton,您可以通过将所需的提供程序放入静态方法来完成此操作:
@NgModule({
imports: [
SharedModule,
levelOneRouter
],
providers: [],
declarations: []
})
export class LevelOneModule{
static forRoot(): ModuleWithProviders {
return {
ngModule: LevelOneModule,
providers: [SomeService]
};
}
}
之后,在导入时调用
LevelTwoModule
此静态方法:@NgModule({
imports: [
LevelOneModule.forRoot(),
levelTwoRouter
],
providers: [],
declarations: []
})
这样,在
LevelOneModule
中实例化的提供程序作为单例传递给子模块。更多信息:guide
问题2的答案
使声明(管道/组件/指令/服务)在另一个模块中可用。您应该将这些声明添加到
exports
参数中:@NgModule({
imports: [
SharedModule,
levelOneRouter
],
providers: [],
declarations: [
ComponentIJustWantToUseInHere,
ComponentIWantToUseHereAndElsewhere
],
exports : [
ComponentIWantToUseHereAndElsewhere,
ComponentOrPipeOrWhateverIWantToUseElsewhere
]
})
export class LevelOneModule{
static forRoot(): ModuleWithProviders {
return {
ngModule: LevelOneModule,
providers: [SomeService]
};
}
}