gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:58:26 25 4
gpt4 key购买 nike

我正在尝试从组件内的延迟加载模块访问服务实例。该模块没有任何组件可用于基于构造函数的注入(inject)。 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。

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

最佳答案

我最终找到了一种方法,它似乎可以解决 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 );
});

在下面的导出 block 中,是使服务可用的 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 ) 的内容解决了这个问题

关于angular - 如何在没有组件的情况下从 Angular 9+ 中的延迟加载模块动态注入(inject)服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64598451/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com