Angular中Injector.create创建的注入器是否会被销毁?生命周期疑问
动态创建注入器的生命周期问题:服务未执行ngOnDestroy的原因与解决方案
问题原因
Angular中,通过Injector.create()手动创建的注入器属于独立实例,不会自动绑定到组件的销毁生命周期。当你销毁动态组件时,Angular只会清理组件自身关联的注入器(也就是通过@Component装饰器providers声明服务的注入器),但它无法追踪到你手动创建的自定义注入器,因此不会触发该注入器内服务的ngOnDestroy钩子。
解决方案:手动管理注入器销毁
要让动态注入器中的服务执行销毁逻辑,你需要主动追踪注入器实例,并在合适时机调用其destroy()方法。
具体步骤
保存自定义注入器实例
在创建动态组件前,先创建并保存注入器对象,再传入createComponent方法:// 父组件中保存注入器实例 private customInjector?: Injector; createChildComponent() { // 创建自定义注入器 this.customInjector = Injector.create({ providers: [{ provide: ChildService, useClass: ChildService }], parent: this.viewContainerRef.injector }); // 使用该注入器创建动态组件 const componentRef = this.viewContainerRef.createComponent(ChildComponent, { injector: this.customInjector }); }在父组件销毁时手动销毁注入器
重写父组件的ngOnDestroy钩子,调用注入器的destroy()方法,这会触发其内部所有服务的ngOnDestroy:ngOnDestroy() { // 销毁自定义注入器,触发服务的销毁钩子 this.customInjector?.destroy(); }
补充说明
- 组件通过@Component装饰器声明的服务能自动销毁,是因为这些服务属于组件自身的注入器,而组件的注入器由Angular框架管理——组件销毁时,框架会自动调用该注入器的
destroy()方法,进而触发服务的销毁逻辑。 - 如果不手动销毁自定义注入器,其内部的服务实例会一直驻留在内存中,直到页面刷新,可能引发内存泄漏问题。
内容的提问来源于stack exchange,提问作者Alexey Kurnev
相关产品推荐
相关产品推荐

