Angular Уничтожение динамически созданного компонента полностью - PullRequest
0 голосов
/ 13 сентября 2018

Я создаю много динамических компонентов, используя:

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

Когда мне нужно уничтожить компонент, я вызываю метод уничтожения:

this.sliderComponentReference.destroy();

Я понимаю, что он удалил динамический компонентоднако, если смотреть на переменную сразу после того, как я заметил, что она все еще содержит информацию:

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

Вопросы:

  1. Почему переменная все еще имеет ссылку на экземпляр компонента, если он был уничтожен?

  2. Сохраняется ли компонент в памяти?Если да, то можно ли его восстановить?

1 Ответ

0 голосов
/ 13 сентября 2018

Вы можете увидеть определение ссылки на компонент здесь: https://github.com/angular/angular/blob/master/packages/core/src/view/refs.ts#L103 - у него есть свойства changeDetectorRef, hostView и т. Д.Когда вы вызываете .destroy, он вызывает базовый метод viewRef.destroy: https://github.com/angular/angular/blob/master/packages/core/src/view/refs.ts#L277

Это приводит к вызову других методов, но, похоже, фактически не перезаписывает какие-либо свойства, которые уже были определены вссылка на компонентНасколько я знаю в JavaScript, объект не может удалить себя.Вы можете удалить только свойства объекта со ссылкой на этот объект.

Компонент все еще хранится в памяти и в некотором смысле все еще может использоваться.Однако он может работать не так, как вы ожидаете, из-за того, что делает .destroy.Вы могли бы воссоздать его, хотя ... и есть методы attach.JavaScript выполняет свою собственную сборку мусора / управление памятью, поэтому вы не можете принудительно удалить эти элементы из памяти.Если JavaScript обнаружит, что ссылка больше не доступна никаким указателям во время цикла сборки мусора, он освободит эту память.

...