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


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>

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


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


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


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>



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>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.