NgModule的哪一部分满足NgModuleFactoryLoader.load(???)

时间:2017-08-22 22:08:54

标签: angular dependency-injection

我正在阅读https://blog.nrwl.io/essential-angular-ngmodules-16474ea99713作者:Victor Savkin,我在Lazyloading NgModuleFactoryLoader上有点迷失。

  

延迟加载   正如我上面提到的,NgModules不仅仅是编译单元,它们也是分发的单位。这就是我们引导NgModule而不是组件的原因 - 我们不分发组件,我们分发模块。这也是我们懒惰加载NgModules的原因。

使用NgModuleFactoryLoader NgModule的哪个部分.load()内的参数path指向?

import {NgModuleFactoryLoader, Injector} from '@angular/core';

class MyService {
  constructor(loader: NgModuleFactoryLoader, injector: Injector) {
    loader.load("mymodule").then((f: NgModuleFactory) => {
      const moduleRef = f.create(injector);
      moduleRef.injector; // module injector
      moduleRef.componentFactoryResolver; // all the components factories of the lazy-loaded module
    });
  }
}

问题:

如何在 ExampleModule内引用NgModuleFactoryLoader.load(???)

@NgModule({
  imports: [ModuleA, ModuleB]
})
class ExampleModule {
  constructor() {
  }
}

1 个答案:

答案 0 :(得分:2)

  

NgModule的哪一部分在.load()中的param路径指向?

它没有指向NgModule,它指向将用于获取JS模块/文件的URL。

  

如何在其中引用ExampleModule   NgModuleFactoryLoader.load(???)

您需要使用#分隔符:

 loader.load("path/to/module#ExportedModuleName")

这可以在消息来源中看到:

const _SEPARATOR = '#';

export class SystemJsNgModuleLoader implements NgModuleFactoryLoader {
  private _config: SystemJsNgModuleLoaderConfig;

  constructor(private _compiler: Compiler, @Optional() config?: SystemJsNgModuleLoaderConfig) {
  ...
  private loadAndCompile(path: string): Promise<NgModuleFactory<any>> {
    let [module, exportName] = path.split(_SEPARATOR); <-----
    if (exportName === undefined) {
      exportName = 'default';
    }