Jak miałbym mieć wiele przypadków w *ngIf
wyciągu? Przywykłem do Vue lub kątowej 1 z mającą if
, else if
i else
, ale wydaje się, kanciasty 4 ma tylko true
( if
) i false
( else
) warunek.
Zgodnie z dokumentacją mogę tylko:
<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>
Ale chcę mieć wiele warunków (coś w stylu):
<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>
Ale ostatecznie muszę użyć ngSwitch
, co wydaje się hack:
<ng-container [ngSwitch]="true">
<div *ngSwitchCase="foo === 1">First</div>
<div *ngSwitchCase="bar === 2">Second</div>
<div *ngSwitchDefault>Third</div>
</ng-container>
Alternatywnie, wygląda na to, że wiele składni, do których przyzwyczaiłem się z Angular 1 i Vue, nie jest obsługiwanych w Angular 4, więc jaki byłby zalecany sposób nadania struktury mojego kodu w takich warunkach?
angular
templates
angular-ng-if
Alexander Abakumov
źródło
źródło
Odpowiedzi:
Inną alternatywą są warunki gniazdowe
źródło
<ng-template #second *ngIf="foo === 2;else third">
Możesz po prostu użyć:
chyba że część pojemnika ngowego jest ważna dla twojego projektu.
Oto Plunker
źródło
if (index === 1) else if (foo === 2)
które musiałoby być napisane,if (index === 1) if (index !== 1 && foo === 2)
które jest nieco niechlujne i bardziej podatne na błędy, im więcej razy będziemy musieli pisać logikę odwrotną.if (item === 'food' && kind === 'hamburger') {} else if (item === 'food' && kind === 'hotdog') {} else if (item === 'drink' && kind === 'beer') {} else if (item === 'drink' && kind === 'wine') {} else { /* could be poisonous */ }
NgTemplateOutlet
z kontekstu takiego jak * ngTemplateOutlet = "drink; context: beer" lub może innego składnika do kategoryzacji.Wydaje się, że jest to najczystszy sposób
w szablonie:
Zauważ, że działa
else if
to tak, jak powinna być właściwa instrukcja, gdy warunki dotyczą różnych zmiennych (tylko 1 przypadek jest prawdziwy na raz). Niektóre inne odpowiedzi nie działają w takim przypadku.na bok: rany, kanciasty, to naprawdę brzydki
else if
kod szablonu ...źródło
Możesz użyć wielu sposobów na podstawie ostrożności:
Jeśli zmienna jest ograniczony do konkretnego numeru lub String , najlepszym sposobem jest użycie ngSwitch lub ngIf:
Powyższe nie nadaje się do kodów if elseif else i kodów dynamicznych, możesz użyć poniższego kodu:
źródło
*ngIf="foo >= 7; then t7"
zamiast... else t7
.foo >= 4 && foo <= 6; then t46; else t7
powinny działać.Aby uniknąć zagnieżdżania i ngSwitch, istnieje również taka możliwość, która wykorzystuje sposób działania operatorów logicznych w JavaScript:
źródło
A może po prostu użyj łańcuchów warunkowych z operatorem trójargumentowym.
if … else if … else if … else
łańcuch.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator#Conditional_chains
Bardziej podoba mi się to podejście.
źródło
<ion-row *ngIf="cat === 1;else second"></ion-row> <ng-template #second> <ion-row *ngIf="cat === 2;else third"></ion-row> </ng-template> <ng-template #third> </ng-template>
źródło
Możesz także użyć tej starej sztuczki do konwersji złożonych bloków if / then / else w nieco czystszą instrukcję switch:
źródło