Как объяснено в документации Angular , ngTemplate
не может быть отображено само по себе; это должно быть отображено структурной директивой. Используя в своей разметке *ngIf
сокращенный синтаксис , вы получите эквивалентную разметку:
<ng-template [ngIf]="isTrue" [ngIfElse]="disabled_lock">
<ng-template>
<option value="{{i.OBJECTID}}">{{i.OBJECTID}}</option>
</ng-template>
</ng-template>
<ng-template #disabled_lock>
<option value="{{i.OBJECTID}}" disabled>{{i.OBJECTID}}</option>
</ng-template>
Внешний ngTemplate
части ngIf
соответствующим образом контролируется директива ngIf
, но к внутренней ngTemplate
не применена структурная директива. В результате он никогда не отображается.
Одним из возможных решений является использование явной записи ngIf
, как это предлагается в ответе SoCo . Другое решение - применить директиву *ngIf
к элементу option
:
<option *ngIf="isTrue else disabled_lock" value="{{i.OBJECTID}}">{{i.OBJECTID}}</option>
<ng-template #disabled_lock>
<option value="{{i.OBJECTID}}" disabled>{{i.OBJECTID}}</option>
</ng-template>
В тех случаях, когда первый ngTemplate
будет содержать несколько элементов, вы можете заменить его на ng‑container
:
<ng-container *ngIf="isTrue else disabled_lock">
<option value="value1">Caption 1</option>
<option value="value2">Caption 2</option>
</ng-container>
<ng-template #disabled_lock>
<option value="value3" disabled>Caption 3</option>
</ng-template>
Вы можете поэкспериментировать со следующими примерами стекаблица: первый аналогичен вашему текущему коду, а второй применяет директиву *ngIf
к HTML элемент вместо ngTemplate
.
С учетом всего сказанного, вашему примеру кода на самом деле не нужна структурная директива ngIf
, поскольку эти две части отличаются только свойством disabled
. Вы можете просто связать это свойство:
<option value="{{i.OBJECTID}}" [disabled]="!isTrue">{{i.OBJECTID}}</option>