Этот подход кажется слишком сложным, поскольку ваш контент также содержит ваши собственные компоненты.Вместо этого вы можете переместить эту логику в отдельный компонент, который сделает ваш код аккуратным и лаконичным.Создайте компонент, скажем conditional-wrapper
, и добавьте его в свой модуль.В компонент просто поместите базовый Input
, чтобы принять wrapperElement
от родителя.
@Input() wrapperElement: boolean;
В шаблоне просто добавьте код, чтобы условно отображать любой element
как оболочку или без оболочки какпо умолчанию используется ngSwitch
.
<ng-container [ngSwitch]="wrapperElement">
<div *ngSwitchCase="'div'">
<ng-container *ngTemplateOutlet="noWrapper"></ng-container>
</div>
<h2 *ngSwitchCase="'h2'">
<ng-container *ngTemplateOutlet="noWrapper"></ng-container>
</h2>
<ng-container *ngSwitchDefault>
<ng-container *ngTemplateOutlet="noWrapper"></ng-container>
</ng-container>
</ng-container>
<ng-template #noWrapper>
<ng-content></ng-content>
</ng-template>
Теперь все, что вам нужно, это рекурсивно показать conditional-wrapper
из родительского компонента, а ng-content
покажет данные проекта из родительского компонента в дочерний.
<conditional-wrapper [wrapperElement]="condition ? 'div': ''">
<h2>Child 1</h2>
<p>Child 2</p>
<footer>Child 3</footer>
<conditional-wrapper [wrapperElement]="condition ? 'div': ''">
<p>Nested Child 4</p>
</conditional-wrapper>
</conditional-wrapper>
Вот рабочий пример для StackBlitz .