angular - 如何销毁以编程方式注入动态创建的角度组件的服务?
问题描述
在 Angular 中,可以在运行时动态加载和查看组件,方法是调用viewContainerRef.createComponent(factory)
的实例ViewContainerRef
,传递可以创建组件实例的工厂。
通过将Injector
实例作为第三个参数传递,可以(以编程方式)为动态加载的组件(及其子组件)提供额外的服务,例如:
const injector = Injector.create({
providers: [
{ provide: AdditionalService, useClass: AdditionalService },
],
parent: parentInjector
});
const componentRef = viewContainerRef.createComponent(factory, undefined, injector);
但是,附加服务仅在动态创建的组件需要它时才被实例化——所以我们不知道注入器是否还持有该服务的实例。一段时间后,我们销毁动态创建的组件:
// some time later, we destroy the dynamically created component:
componentRef.destroy();
不幸的是,销毁组件不会自动销毁(可能存在的)服务!而且注入器没有提供销毁的方法,所以无法销毁附加的服务。
我们如何才能ngOnDestroy()
正确维护那些以编程方式提供的服务的生命周期(尤其是 )?
注意:我在 StackBlitz 上实现了一个简短的示例来演示此行为。它动态加载需要两个服务的组件。第一个服务在组件级别 ( @Component({ provides: [ FirstService ]}
) 上提供,第二个通过注入器提供,如上所述。当组件被销毁时,第一个服务被正确销毁,而第二个“保持活动状态”。
解决方案
而且注入器没有提供销毁的方法,所以无法销毁附加的服务。
有injector.destroy
哪个实际上调用SecondService.ngOnDestroy
. 如果您考虑一下-这似乎合乎逻辑,但我根本找不到该方法的任何文档...
推荐阅读
- python-3.x - elasticsearch5的身份验证异常
- system.reactive - 如何实现你自己的合并操作符,它可以正确地合并冷的 observables
- docker - docker-compose 等待启动,直到挂载主机文件系统
- python - 规范化python
- javascript - 外层 div 有点击功能,内层 div 没有
- python - 如何以矢量化形式计算这种乘法?
- javascript - Moment.js 从现在/今天在几天、几个月和几年前
- android - 登录错误的 Nativescript 示例应用程序:活动用户已存在。请在登录前注销活动用户
- javascript - dragula js:如何限制droparea中的元素数量?
- reactjs - Visual Studio 2019 Enterprise 中的 HTML 自动完成(或 Emmet 或 ZenCoding)在编辑 JSX 时不起作用。(不是 VS 代码)