Иногда в приложении возникает ситуация, когда вы на самом деле не знаете, какой компонент вы хотите визуализировать во время выполнения. В качестве примера давайте представим процесс оформления заказа, в котором от выбора зависит, какие вкладки будут отображаться. Если заказ бесплатный, отображаются только вкладки с информацией о пользователе и подтверждения. Если заказ оплачен, то это плюс форма оплаты.
В этой гипотезе нам нужно найти способ сообщить Angular о рендеринге тех компонентов, которые нам нужны. Встречайте NgComponentOutlet. Я не знал об этой директиве и поэтому предложил немного более ручное решение, но Роб Вормолд, бог Angular и других вещей, указал мне на еще более чистое решение.
Давайте посмотрим на псевдокод, который поможет нам это визуализировать:
public dynamicTabs = [ { label: 'User Information', component: UserInformationComponent }, { label: 'Payment', component: PaymentComponent }, { label: 'Thank You', component: ThankYouComponent } ];
У каждого объекта есть метка и компонент, который мы хотим визуализировать. Теперь предположим, что мы хотим отобразить эти компоненты в простой настройке вкладки:
<mat-tab-group> <mat-tab *ngFor="let tab of dynamicTabs" label="{{tab.label}}"> <ng-container *ngComponentOutlet="tab.component"> </ng-container> </mat-tab> </mat-tab-group>
Вот и все! Каждый из этих контейнеров будет отображать тот компонент, который вы указали в своем объекте. Если вам нужно больше контроля, вы даже можете передать дополнительные параметры и настраиваемые форсунки. Вся внутренняя работа изложена в Документации по Angular.
Я постоянно удивляюсь тому, на что способен Angular. В обмен на дополнительную сложность по сравнению с React или Vue, вы действительно получаете набор инструментов, который одновременно широк и глубок.