Angular view¶
Для манипуляций с DOM-элементами в Angular используются так называемые абстракции, которые представлены классами ElementRef, TemplateRef, ViewRef, ComponentRef и ViewContainerRef.
Сами абстракции представляют шаблон компонента или его отдельные части.
Для получения доступа к абстракциям используется механизм DOM-запросов, реализованных декораторами @ViewChild() (возвращает одну ссылку) и @ViewChildren() (возвращает массив ссылок).
Указанные декораторы используются совместно с шаблонными переменными, являющимися именованными ссылками на шаблон или его части. Именно они служат идентификатором для получения нужного шаблона.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | |
В примере ссылка на представление сохраняется в переменную title и становится доступной только в момент вызова AfterViewInit.
Если запрашиваемое представление является стандартным HTML-тегом, то запрос вернет ссылку типа ElementRef, если же это Angular элемент <ng-template /> — ссылку типа TemplateRef.
Рассмотрим каждую из абстракций более подробно.
ElementRef¶
Основная и самая часто используемая абстракция — ElementRef. Она хранит в себе "оригинальный" HTML-элемент в свойстве nativeElement так, если бы он был получен с помощью нативного JavaScript.
1 2 3 4 5 6 7 8 9 10 11 12 | |
Манипуляции с элементом через nativeElement рекомендуется использовать только в самом крайнем случае, поскольку это нарушает принцип реализации слоев представлений в Angular.
В большинстве случаев хватает функционала, предоставляемых стандартными Angular директивами.
TemplateRef¶
Ранее уже упоминалось, что ссылка типа TemplateRef возвращается в том случае, если запрос возвращает представление, заключенное в специальные теги <ng-template />.
Класс TemplateRef содержит единственное свойство elementRef, содержащее экземпляр класса ElementRef, который в свою очередь ссылается на host-элемент.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
Также экземпляр класса TemplateRef содержит метод createEmbeddedView(), который позволяет создавать представления и возвращать на них ссылку типа ViewRef.
ViewRef¶
Класс ViewRef отражает представления. В Angular представление является структурной составляющей интерфейса приложения.
В Angular различают два вида представлений:
- Embedded Views — относятся к элементу
<ng-template />; - Host Views — относятся к компоненту и инициализируются в момент динамического создания компонентов.
Embedded и Host Views размещаются в контейнере ViewContainerRef.
Оба примера создают представление и возвращают на него ссылку типа ViewRef. После создания представления могут быть вставлены в ссылку типа ViewContainerRef или, проще говоря, контейнер.
ViewContainerRef¶
Контейнером для представлений может служить абсолютно любой DOM-элемент. Важно отметить, что вставка представлений происходит не внутрь контейнера, а сразу после него.
Но лучше всего использовать как контейнер специальный Angular-элемент <ng-container />.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | |
Как и другие абстракции, ссылка ViewConatainerRef имеет привязку в DOM-дереве.
Для осуществления манипуляций с представлениями внутри контейнера, у экземпляра класса ViewContainerRef предусмотрен ряд методов:
insert(viewRef: ViewRef, index?: number)— вставляет представлениеviewRefна позициюindex(еслиindexне указан, то вставка осуществляется в конец);clear()— удаляет все представления из контейнера;get(index: number)— возвращает представление типаViewRefпо заданному индексу;indexOf(viewRef: ViewRef)— возвращает индекс переданного представления;detach(index?: number)— удаляет представление по конкретному индексу, если индекс не передан — удаляет последнее представление;move(viewRef: ViewRef, currentIndex: number)— меняет индекс представленияviewRefнаcurrentIndex.
ComponentRef¶
Ссылка типа ComponentRef возвращается при динамическом создании компонента с использованием сервиса ComponentFactoryResolver. Описание вынесено в отдельную главу.
ngTemplateOutlet и ngComponentOutlet¶
Директива ngTemplateOutlet создает из DOM-элемента ссылку ViewContainerRef и вставляет в него Embedded View, которое формируется по переданной шаблонной переменной прямо в шаблоне без написания кода в контроллере компонента.
1 2 3 4 5 6 7 8 9 10 11 | |
Также в такие представления можно передавать данные.
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
Директива ngComponentOutlet аналогична ngTemplateOutlet. Различие лишь в том, что она формирует представление Host View по переданному ей названию компонента.
1 2 3 | |