延迟加载Angular 2

时间:2016-08-25 13:27:12

标签: angular

我正在尝试配置我的应用程序以使用RC5中的Lazy Loaded Modules。这是我遇到的问题。

我有一个使用RouterModule.forChild(router)的模块并且延迟加载我们称之为LevelOneModule。这个模块还有一些延迟加载的模块让我们称之为LevelTwoModule-s。这在很大程度上起作用,但我必须解决市长问题:

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

    LevelOneModule

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

    LevelTwoModule:

    @NgModule({
        imports: [
            SharedModule,
            levelTwoRouter
        ],
        providers: [],
        declarations: [...]
    })
    
    1. 我希望LevelOneModule能够在多个LevelTwoModule-s中注册一些我需要的声明,而且我不会放弃如何实现这一点。
    2. 如果我只是尝试在LevelOneModule中注册声明:

      declarations: [SomeComponent, ANotherComponent]
      

      我收到无法识别的元素错误,如果我尝试单独在每个LevelTwoModule中注册声明,我会收到is part of the declarations of 2 modules错误。

      我还尝试为LevelOneModule创建另一个SharedModule,但这也不起作用。

      非常感谢任何帮助或信息,只是指向正确的方向。

1 个答案:

答案 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]
    };
  }
}