角度完全破坏动态创建的组件

时间:2018-09-13 16:10:43

标签: angular typescript reference components destroy

我使用以下方法创建了许多动态组件:

this.factory = this.componentFactoryResolver.resolveComponentFactory(SliderComponent);
this.sliderComponentReference = viewContainerRef.createComponent(this.factory);

当我需要销毁组件时,我调用destroy方法:

this.sliderComponentReference.destroy();

我知道它从视图中删除了动态组件,但它是实例,但是当我在看到变量仍具有信息之后立即查看该变量时,

changeDetectorRef: ViewRef_ {_view: {…}, _viewContainerRef: ViewContainerRef.. }
componentType:(...)
hostView: ViewRef_ {_view: {…}, _viewContainerRef: ViewContainerRef... }}
injector:(...)

问题:

  1. 如果变量被销毁,为什么变量仍然引用组件实例?

  2. 该组件是否仍存储在内存中?如果可以,可以检索吗?

1 个答案:

答案 0 :(得分:1)

您可以在此处查看组件引用定义:https://github.com/angular/angular/blob/master/packages/core/src/view/refs.ts#L103-它具有changeDetectorRefhostView等属性。调用.destroy时,它会调用基础的viewRef.destroy方法:https://github.com/angular/angular/blob/master/packages/core/src/view/refs.ts#L277

这最终会调用其他方法,但是似乎并没有真正覆盖组件ref上已经定义的任何属性。据我所知,JavaScript无法删除对象。您只能删除引用了该对象的对象的属性。

该组件仍存储在内存中,在某种意义上仍然可以使用。但是,由于.destroy的作用,它可能无法按预期工作。您也许可以重新创建它,而且还有attach方法。 JavaScript会执行自己的垃圾回收/内存管理,因此您无法真正强制将这些元素从内存中删除。如果JavaScript在垃圾回收周期中检测到该引用不再可被任何指针访问,它将释放该内存。