如何在没有组件的情况下从Angular 9+中的延迟加载模块动态注入服务?

时间:2020-10-29 20:01:41

标签: angular lazy-loading angular-services angular-injector

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

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

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。

任何人都可以解释应该如何完成惰性服务加载吗?

1 个答案:

答案 0 :(得分: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)的内容帮助下找到了答案