Як уже зазначалося, це здається неможливим. Одне, що можна використати для запобігання принаймні певного дублювання ng-template
. Це дозволяє витягти вміст елемента, на який впливає ngIf
розгалуження.
Якщо ви, наприклад, хочете створити ієрархічний компонент меню, використовуючи Angular Material:
<!-- Button contents -->
<ng-template #contentTemplate>
<mat-icon *ngIf="item.icon != null">{{ item.icon }}</mat-icon>
{{ item.label }}
</ng-template>
<!-- Leaf button -->
<button *ngIf="item.children == null" mat-menu-item
(click)="executeCommand()"
[disabled]="enabled == false">
<ng-container *ngTemplateOutlet="contentTemplate"></ng-container>
</button>
<!-- Node button -->
<ng-container *ngIf="item.children != null">
<button mat-menu-item
[matMenuTriggerFor]="subMenu">
<ng-container *ngTemplateOutlet="contentTemplate"></ng-container>
</button>
<mat-menu #subMenu="matMenu">
<menu-item *ngFor="let child of item.children" [item]="child"></menu-item>
</mat-menu>
</ng-container>
Тут умовно застосовувана директива matMenuTriggerFor
, яку слід застосовувати лише до пунктів меню з дітьми. Вміст кнопки вставляється в обох місцях через ngTemplateOutlet
.