我正在尝试从组件内部的延迟加载模块访问服务的实例。该模块没有任何组件可用于基于构造函数的注入。 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。
任何人都可以解释应该如何完成惰性服务加载吗?
答案 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)的内容帮助下找到了答案