我正在尝试配置我的应用程序以使用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]
    };
  }
}

10-06 02:58