我正在尝试配置我的应用程序以使用RC5中的Lazy Loaded Modules。这是我遇到的问题。
我有一个使用RouterModule.forChild(router)
的模块并且延迟加载我们称之为LevelOneModule。这个模块还有一些延迟加载的模块让我们称之为LevelTwoModule-s。这在很大程度上起作用,但我必须解决市长问题:
以下是代码示例:
LevelOneModule
@NgModule({
imports: [
SharedModule,
levelOneRouter
],
providers: [SomeService],
declarations: [...]
})
LevelTwoModule:
@NgModule({
imports: [
SharedModule,
levelTwoRouter
],
providers: [],
declarations: [...]
})
如果我只是尝试在LevelOneModule中注册声明:
declarations: [SomeComponent, ANotherComponent]
我收到无法识别的元素错误,如果我尝试单独在每个LevelTwoModule中注册声明,我会收到is part of the declarations of 2 modules
错误。
我还尝试为LevelOneModule创建另一个SharedModule,但这也不起作用。
非常感谢任何帮助或信息,只是指向正确的方向。
答案 0 :(得分:2)
回答问题#1
您应该要求LevelOneModule
注册单例,您可以通过将所需的提供程序放在静态方法中来实现:
@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]
};
}
}