Что такое представление?

Наименьшая группа отображаемых элементов, которая может быть создана и уничтожена вместе.

Свойства элементов в представлении могут изменяться динамически в ответ на действия пользователя; структура (количество и порядок) элементов в представлении не может. Структура элементов может быть изменена путем вставки, перемещения или удаления вложенных представлений в их контейнерах представлений. - согласно Angular Docs. ​​

Представления - это в основном структура данных, которая состоит из узлов представления, которые содержат ссылки на соответствующие элементы DOM. С каждым компонентом связано представление компонента.

Цикл обнаружения изменений выполняется для представлений, и когда angular обнаруживает изменение в состоянии представления компонента, соответствующие узловые элементы в DOM визуализируются снова.

Ниже представлена ​​структура представления:

Элементы в шаблоне компонента добавляются в виде массива узлов. Вышеупомянутый вид имеет 5 узлов в своем шаблоне. Свойство component содержит состояние связанного компонента.

Классы, относящиеся к представлениям:

ChangeDetectorRef - базовый класс для угловых представлений, обеспечивает функцию обнаружения изменений. Этот класс предоставляет различные методы, связанные с обнаружением изменений.

ViewRef - представляет представление Angular, в частности представление хоста, определенное компонентом. Этот класс расширяет ChangeDetectorRef. Помимо методов, унаследованных от родительского класса, он предоставляет метод, связанный с представлением компонента / компонента.

EmbeddedViewRef - представляет угловое представление в контейнере представления. На встроенное представление можно ссылаться из компонента, отличного от компонента хоста, шаблон которого определяет его, или он может быть определен независимо с помощью TemplateRef.

ViewContainerRef - представляет контейнер, в котором одно или несколько представлений могут быть прикреплены к компоненту. Он может содержать основные представления (созданные путем создания экземпляра компонента с помощью метода createComponent()) и встроенные представления (созданные путем создания экземпляра TemplateRef с помощью метода createEmbeddedView()).

Экземпляр контейнера представления может содержать другие контейнеры представления, создавая иерархию представления.

Типы просмотров

Существует два типа представлений: Встроенное и Хост.

Встроенные представления связаны с шаблонами, тогда как основные представления связаны с компонентами.

Создание встроенного представления

В приведенном ниже примере мы создаем встроенное представление из шаблона, вставленного в шаблон компонента.

Теги <ng-container></ng-container> используются в качестве контейнера представления (при чтении его как ViewContainer с помощью запроса @ViewChild) для встроенного представления. Он действует как элемент привязки, под которым представление будет вставлено в шаблон компонента.

Методу контейнера createEmbeddedView () передается ссылка на шаблон для создания представления.

import { Component, AfterViewInit, ViewChild,
ViewContainerRef, TemplateRef } from '@angular/core';
@Component({
  selector: 'app-embedded-view',
  template: `
  <h1>Application Content</h1>
  <ng-container #vc></ng-container> 
  <h3>End of Application</h3>
  <ng-template #tpl>
    <h1>Template Header</h1>
  </ng-template>
  `
})
export class EmbeddedViewComponent implements AfterViewInit {
  @ViewChild("tpl", { read: TemplateRef }) tpl: TemplateRef<any>;
  @ViewChild("vc", { read: ViewContainerRef }) container: ViewContainerRef;
  constructor() { }
  ngAfterViewInit() {
    this.container.createEmbeddedView(this.tpl);
  }
}

Создание представления хоста

Представления хоста связаны с компонентом. Они создаются, когда компонент создается динамически. Ниже DynamicComponent динамически создается с использованием своей фабрики.

Фабрика разрешается с помощью экземпляра ComponentFactoryResolver, введенного в конструктор компонента.

Наконец, представление компонента добавляется в контейнер представления с помощью метода контейнера createComponent () и передачи фабрики DynamicComponent.

@Component({
  template: `<h1>I am dynamically used component element.</h1>`
})
export class DynamicComponent { }
import { AfterViewInit, Component, ViewChild,
ViewContainerRef, ComponentFactoryResolver } from '@angular/core';
import { DynamicComponent} from './dynamic.component';
@Component({
  selector: 'app-host-view',
  template: `
  <h1>Host View example</h1>
  <ng-container #container></ng-container>
  `,
  entryComponents: [ DynamicComponent]
})
export class HostViewComponent implements AfterViewInit {
  @ViewChild("container", { read: ViewContainerRef }) ctr: ViewContainerRef;
  constructor(private resolver: ComponentFactoryResolver) { }
  ngAfterViewInit() {
    const factory = this.resolver.resolveComponentFactory(DynamicComponent);
    this.ctr.createComponent(factory);
  }
}

Следует убедиться, что компонент, который должен быть создан динамически, должен быть добавлен в массив entryComponents, чтобы фабрика для компонента была создана во время компиляции.

Спасибо за уделенное время… :)