* ngIf lagi kalo di template

101

Bagaimana saya memiliki banyak kasus dalam sebuah *ngIfpernyataan? Aku digunakan untuk Vue atau sudut 1 dengan memiliki if, else if, dan else, tetapi tampaknya seperti sudut 4 hanya memiliki true( if) dan false( else) kondisi.

Menurut dokumentasi, saya hanya dapat melakukan:

  <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>

Tetapi saya ingin memiliki banyak kondisi (seperti):

  <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>

Tapi saya akhirnya harus menggunakan ngSwitch, yang terasa seperti retasan:

  <ng-container [ngSwitch]="true">
    <div *ngSwitchCase="foo === 1">First</div>
    <div *ngSwitchCase="bar === 2">Second</div>
    <div *ngSwitchDefault>Third</div>
  </ng-container>

Bergantian, sepertinya banyak sintaks yang saya gunakan dari Angular 1 dan Vue tidak didukung di Angular 4, jadi apa cara yang direkomendasikan untuk menyusun kode saya dengan kondisi seperti ini?

Alexander Abakumov
sumber
Saya berpikir bahwa Anda meretas adalah solusi terbaik karena paling mudah dibaca. Namun saya telah menyadari bahwa pernyataan saklar sudut memungkinkan beberapa kriteria untuk dicocokkan sehingga Anda tidak mendapatkan logika elseif yang benar.
Tom Benyon

Jawaban:

145

Alternatif lain adalah dengan kondisi sarang

<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>
CornelC
sumber
4
Ini adalah solusi yang lebih baik untuk saya. Kondisi saya didasarkan pada banyak variabel dan lebih dari satu variabel mampu menjadi benar pada saat yang bersamaan.
Matt DeKok
1
Tidak bisakah kita menggunakan seperti<ng-template #second *ngIf="foo === 2;else third">
Loki
pintar. harus diperkenalkan ke kerangka tbh
Pogrindis
36

Anda bisa menggunakan:

<ng-template [ngIf]="index == 1">First</ng-template>
<ng-template [ngIf]="index == 2">Second</ng-template>
<ng-template [ngIf]="index == 3">Third</ng-template>

kecuali bagian ng-container penting untuk desain Anda, saya kira.

Ini Plunker

Dylan
sumber
1
Contoh saya sedikit sederhana, tetapi mengharapkan perilaku 'lain jika' seperti if (index === 1) else if (foo === 2)yang harus ditulis if (index === 1) if (index !== 1 && foo === 2)yang agak berantakan dan lebih rentan terhadap kesalahan, semakin sering kita harus menulis logika terbalik.
Sudahkah Anda melihat plunker? Saya rasa saya tidak melihat masalahnya, indeks hanya akan menjadi 1 hal pada satu waktu.
Dylan
Saya pikir contoh saya yang kurang penjelasan, berikut ini adalah contoh di JS: 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 */ }
1
Masih terlalu banyak pengecualian timbal balik dalam contoh itu, tetapi tetap saja, intinya adalah, saya perlu melakukan if, else if, dan else, bukan hanya jika dan lain tanpa menulis banyak logika yang berlebihan. Sepertinya template Angular 4 tidak memiliki logika semacam ini.
1
ada beberapa pilihan lain, ini sepertinya Anda bisa mendapatkan keuntungan dari NgTemplateOutletdengan konteks seperti * ngTemplateOutlet = "drink; context: beer", atau mungkin komponen lain untuk kategorisasi.
Dylan
26

Ini sepertinya cara terbersih untuk dilakukan

if (foo === 1) {

} else if (bar === 99) {

} else if (foo === 2) {

} else {

}

di dalam template:

<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>

Perhatikan bahwa ini berfungsi seperti else ifpernyataan yang tepat jika kondisi melibatkan variabel yang berbeda (hanya 1 kasus yang benar pada satu waktu). Beberapa jawaban lain tidak berfungsi dengan baik dalam kasus seperti itu.

samping: astaga, itu beberapa else ifkode template yang sangat jelek ...

kambing
sumber
17

Anda dapat menggunakan berbagai cara berdasarkan sitaution:

  1. Jika Variabel Anda terbatas pada Angka atau String tertentu , cara terbaik adalah menggunakan ngSwitch atau 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>
    
  2. Di atas tidak cocok untuk kode if elseif lain dan kode dinamis, Anda dapat menggunakan kode di bawah ini:

    <!-- 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>
    

Catatan: Anda dapat memilih format apa pun, tetapi perhatikan setiap kode memiliki masalah sendiri

Sina Lotfi
sumber
1
IMO 2. harus membaca, *ngIf="foo >= 7; then t7"bukan ... else t7.
hgoebl
Saya pikir hanya dua baris dengan yang kedua foo >= 4 && foo <= 6; then t46; else t7harus bekerja.
Cloud
4

Untuk menghindari bersarang dan ngSwitch, ada juga kemungkinan ini, yang memanfaatkan cara kerja operator logika di Javascript:

<ng-container *ngIf="foo === 1; then first; else (foo === 2 && second) || (foo === 3 && third)"></ng-container>
  <ng-template #first>First</ng-template>
  <ng-template #second>Second</ng-template>
  <ng-template #third>Third</ng-template>
Max21
sumber
2

Atau mungkin gunakan saja rantai kondisional dengan operator terner. if … else if … else if … elserantai.

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Conditional_Operator#Conditional_chains

<ng-container *ngIf="isFirst ? first: isSecond ? second : third"></ng-container>

<ng-template #first></ng-template>
<ng-template #second></ng-template>
<ng-template #third></ng-template>

Saya lebih suka pendekatan ini.

Gerald Hughes
sumber
0

<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>

Angular sudah menggunakan ng-template di bawah tenda di banyak arahan struktural yang kita gunakan sepanjang waktu: ngIf, ngFor dan ngSwitch.

> Apa itu ng-template di Angular

https://www.angularjswiki.com/angular/what-is-ng-template-in-angular/

Supriya
sumber
0

Anda juga dapat menggunakan trik lama ini untuk mengonversi blok if / then / else kompleks menjadi pernyataan switch yang sedikit lebih bersih:

<div [ngSwitch]="true">
    <button (click)="foo=(++foo%3)+1">Switch!</button>

    <div *ngSwitchCase="foo === 1">one</div>
    <div *ngSwitchCase="foo === 2">two</div>
    <div *ngSwitchCase="foo === 3">three</div>
</div>
Michael Payne
sumber