Angular 角度2中的延迟加载

Angular 角度2中的延迟加载,angular,Angular,我正试图将我的应用程序配置为使用RC5中的延迟加载模块。这就是我遇到的问题 我有一个模块,它使用RouterModule.forChild(路由器)并得到延迟加载,我们称之为LevelOneModule。这个模块也有一些模块延迟加载,我们称它们为LevelTwoModule-s。这在很大程度上是可行的,但我必须解决以下问题: 我在我的LevelOneModule中提供了一个服务,我需要在LevelTwoModule-s中作为一个单例提供该服务,但出于某种原因,每个LevelTwoModule都有

我正试图将我的应用程序配置为使用RC5中的延迟加载模块。这就是我遇到的问题

我有一个模块,它使用
RouterModule.forChild(路由器)
并得到延迟加载,我们称之为LevelOneModule。这个模块也有一些模块延迟加载,我们称它们为LevelTwoModule-s。这在很大程度上是可行的,但我必须解决以下问题:

  • 我在我的LevelOneModule中提供了一个服务,我需要在LevelTwoModule-s中作为一个单例提供该服务,但出于某种原因,每个LevelTwoModule都有自己的服务实例 下面是一个代码示例:

    一级模块

    @NgModule({
        imports: [
            SharedModule,
            levelOneRouter
        ],
        providers: [SomeService],
        declarations: [...]
    })
    
    LevelTwo模块:

    @NgModule({
        imports: [
            SharedModule,
            levelTwoRouter
        ],
        providers: [],
        declarations: [...]
    })
    
  • 我想让LevelOneModule注册一些声明,我需要这些声明在多个LevelTwoModule-s中可用,我不知道如何实现这一点
  • 如果我只是尝试在LevelOneModule中注册声明:

    declarations: [SomeComponent, ANotherComponent]
    
    我得到了无法识别的元素错误,如果我试图分别在每个LevelTwoModule中注册声明,我得到的
    是两个模块声明的一部分
    错误

    我还尝试为LevelOneModule创建另一个SharedModule,但也没有成功


    非常感谢您提供的任何帮助或信息,为我指明正确的方向。

    回答问题#1

    您应该要求
    LevelOneModule
    注册singleton,您可以通过将所需的提供程序放在静态方法中来实现这一点:

    @NgModule({
        imports: [
            SharedModule,
            levelOneRouter
        ],
        providers: [],
        declarations: []
    })
    export class LevelOneModule{
      static forRoot(): ModuleWithProviders {
        return {
          ngModule: LevelOneModule,
          providers: [SomeService]
        };
      }
    }
    
    之后,在导入时调用
    leveltwodule
    此静态方法:

    @NgModule({
        imports: [
            LevelOneModule.forRoot(),
            levelTwoRouter
        ],
        providers: [],
        declarations: []
    })
    
    这样,在
    LevelOneModule
    中实例化的提供程序将作为一个单例传递给子模块

    欲了解更多信息:


    问题2的答案

    使声明(管道/组件/指令/服务)在另一个模块中可用。您应该将这些声明添加到
    exports
    参数中:

    @NgModule({
        imports: [
            SharedModule,
            levelOneRouter
        ],
        providers: [],
        declarations: [
            ComponentIJustWantToUseInHere,
            ComponentIWantToUseHereAndElsewhere
        ],
        exports : [
            ComponentIWantToUseHereAndElsewhere,
            ComponentOrPipeOrWhateverIWantToUseElsewhere
        ]
    })
    export class LevelOneModule{
      static forRoot(): ModuleWithProviders {
        return {
          ngModule: LevelOneModule,
          providers: [SomeService]
        };
      }
    }
    

    哦,天哪,你说得对,事情很简单,不知道我怎么会错过。对于第二个问题,你可能也有解决方案吗?关于第一部分。我不能让它工作。它们仍然是单例,我是否也应该在app.module.ts中导入LevelOneModule.forRoot()?但是我担心这超出了延迟加载的目的。导出选项也不起作用。我想我得做一个猛扑来驱魔。