1

我正在尝试从组件内的延迟加载模块访问服务实例。该模块没有任何组件可用于基于构造函数的注入。Android 文档没有帮助,我在 Medium 和类似网站上找到的所有各种教程都不适用。

这是执行服务延迟加载的组件的代码。

await import ('./lazy.module')
  .then(module => module.LazyModule)
  .then(module => {return module;})
  .then(module => this.compiler.compileModuleAsync(module))
  .then(factory => {
    let module = factory.create(this.injector);
    this.lazyService = module.injector.get(LazyService);
  });

问题是在当前组件中包含 LazyService 会破坏延迟加载的目的,并且 get() 方法似乎想要一种类型,只为这种方法创建鸡蛋问题。我将 InjectionToken 作为另一种选择进行了研究,但它需要一个通用定义,该定义再次需要导入 LazyService。

谁能解释应该如何完成延迟服务加载?

4

1 回答 1

0

我最终找到了一种方法,它似乎解决了 Angular 的缺陷,而不是基本的 Angular 功能。

这个想法是在模块定义中添加对服务的引用。就我而言,我将服务引用存储在添加到模块定义中的名为“entrySet”的静态变量中。“lazyService”变量只是添加到想要延迟加载服务的组件中的“any”类型变量。

因此,这里是之前发布的用于检索服务的代码的更新:

    await import( './lazy.module' )
        .then( module => module.LazyModule )
        .then( module => {
            this.lazyService = module.entrySet.lazyService;
            return module;
        })
        .then( module => this.compiler.compileModuleAsync( module ) )
        .then( factory => {
            let module = factory.create( this.injector );
            this.lazyService = module.injector.get( this.lazyService );
        });

在下面的导出块中是 LazyModule 的相关代码,以使服务可用:

@NgModule({
    bootstrap: [],
    declarations: []
    imports:
    [
        CommonModule,
    ],
    providers:
    [
        LazyService 
    ]
})
export class SnapshotManagerModule
{
    static entrySet = {
        lazyService: LazyService
    };  
}

我在这篇文章的内容的帮助下弄清楚了这一点(https://medium.com/@ebrehault_25985/angular-9-makes-lazy-loading-without-routing-so-easy-18774092ed34

于 2020-10-30T15:11:19.607 回答