Ответ 1
Другая альтернатива - условия гнезда
<ng-container *ngIf="foo === 1;else second"></ng-container>
<ng-template #second>
<ng-container *ngIf="foo === 2;else third"></ng-container>
</ng-template>
<ng-template #third></ng-template>
Как бы у меня было несколько случаев в выражении *ngIf
? Я привык к Vue или Angular 1 с наличием if
, else if
и else
, но кажется, что Angular 4 имеет только условия true
(if
) и false
(else
).
Согласно документации, я могу сделать только:
<ng-container *ngIf="foo === 1; then first else second"></ng-container>
<ng-template #first>First</ng-template>
<ng-template #second>Second</ng-template>
<ng-template #third>Third</ng-template>
Но я хочу иметь несколько условий (что-то вроде):
<ng-container *ngIf="foo === 1; then first; foo === 2; then second else third"></ng-container>
<ng-template #first>First</ng-template>
<ng-template #second>Second</ng-template>
<ng-template #third>Third</ng-template>
Но я заканчиваю тем, что вынужден использовать ngSwitch
, который выглядит как хак:
<ng-container [ngSwitch]="true">
<div *ngSwitchCase="foo === 1">First</div>
<div *ngSwitchCase="bar === 2">Second</div>
<div *ngSwitchDefault>Third</div>
</ng-container>
С другой стороны, кажется, что многие синтаксисы, к которым я привык из Angular 1 и Vue, не поддерживаются в Angular 4, так что бы я рекомендовал для структурирования моего кода с такими условиями?
Другая альтернатива - условия гнезда
<ng-container *ngIf="foo === 1;else second"></ng-container>
<ng-template #second>
<ng-container *ngIf="foo === 2;else third"></ng-container>
</ng-template>
<ng-template #third></ng-template>
Вы можете просто использовать:
<ng-template [ngIf]="index == 1">First</ng-template>
<ng-template [ngIf]="index == 2">Second</ng-template>
<ng-template [ngIf]="index == 3">Third</ng-template>
если части ng-контейнера важны для вашего дизайна. Я полагаю.
Здесь Plunker
Кажется, это самый чистый способ сделать
if (foo === 1) {
} else if (bar === 99) {
} else if (foo === 2) {
} else {
}
в шаблоне:
<ng-container *ngIf="foo === 1; else elseif1">foo === 1</ng-container>
<ng-template #elseif1>
<ng-container *ngIf="bar === 99; else elseif2">bar === 99</ng-container>
</ng-template>
<ng-template #elseif2>
<ng-container *ngIf="foo === 2; else else1">foo === 2</ng-container>
</ng-template>
<ng-template #else1>else</ng-template>
Обратите внимание, что он работает как обычный оператор else if
должен, когда условия включают разные переменные (за один раз верно только 1 случай). Некоторые из других ответов не работают правильно в таком случае.
в сторону: черт возьми, это действительно ужасно, else if
код шаблона...
Вы можете использовать несколько способов, основанных на sitaution:
Если переменная ограничена конкретным числом или Строкой, лучший способ - использовать ngSwitch или ngIf:
<!-- foo = 3 -->
<div [ngSwitch]="foo">
<div *ngSwitchCase="1">First Number</div>
<div *ngSwitchCase="2">Second Number</div>
<div *ngSwitchCase="3">Third Number</div>
<div *ngSwitchDefault>Other Number</div>
</div>
<!-- foo = 3 -->
<ng-template [ngIf]="foo === 1">First Number</ng-template>
<ng-template [ngIf]="foo === 2">Second Number</ng-template>
<ng-template [ngIf]="foo === 3">Third Number</ng-template>
<!-- foo = 'David' -->
<div [ngSwitch]="foo">
<div *ngSwitchCase="'Daniel'">Daniel String</div>
<div *ngSwitchCase="'David'">David String</div>
<div *ngSwitchCase="'Alex'">Alex String</div>
<div *ngSwitchDefault>Other String</div>
</div>
<!-- foo = 'David' -->
<ng-template [ngIf]="foo === 'Alex'">Alex String</ng-template>
<ng-template [ngIf]="foo === 'David'">David String</ng-template>
<ng-template [ngIf]="foo === 'Daniel'">Daniel String</ng-template>
Выше не подходит для кодов if elseif else и динамических кодов, вы можете использовать ниже код:
<!-- foo = 5 -->
<ng-container *ngIf="foo >= 1 && foo <= 3; then t13"></ng-container>
<ng-container *ngIf="foo >= 4 && foo <= 6; then t46"></ng-container>
<ng-container *ngIf="foo >= 7; then t7"></ng-container>
<!-- If Statement -->
<ng-template #t13>
Template for foo between 1 and 3
</ng-template>
<!-- If Else Statement -->
<ng-template #t46>
Template for foo between 4 and 6
</ng-template>
<!-- Else Statement -->
<ng-template #t7>
Template for foo greater than 7
</ng-template>
Примечание. Вы можете выбрать любой формат, но обратите внимание, что у каждого кода есть собственные проблемы.