* ngIf else eğer şablondaysa


109

Bir *ngIfifadede nasıl birden fazla davam olabilir ? Ben bir sahip Vue veya açısal 1 alışkınım if, else ifve else, ancak yalnızca bir sahip açısal 4 gibi görünüyor true( if) ve false( else) koşulu.

Belgelere göre sadece şunları yapabilirim:

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

Ama birden çok koşulum olmasını istiyorum (buna benzer bir şey):

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

Ama sonunda kullanmak zorunda kaldım ngSwitch, ki bu bir hack gibi geliyor:

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

Alternatif olarak, Angular 1 ve Vue'dan alıştığım sözdizimlerinin çoğu Angular 4'te desteklenmiyor gibi görünüyor, bu yüzden kodumu bu gibi koşullarla yapılandırmanın önerilen yolu nedir?


En okunaklı olduğu için hacklemenin en iyi çözüm olduğunu düşünüyordum. Bununla birlikte, açısal anahtar ifadelerinin birden çok ölçütün eşleşmesine izin verdiğini fark ettim, böylece bu doğru başka mantık mantığını elde edemezsiniz.
Tom Benyon

Yanıtlar:


155

Diğer bir alternatif, koşulları iç içe yerleştirmektir

<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
Bu benim için daha iyi bir çözümdü. Koşullarım birden çok değişkene dayanıyordu ve birden fazlası aynı anda doğru olma yeteneğine sahipti.
Matt DeKok

1
Böyle kullanamaz mıyız<ng-template #second *ngIf="foo === 2;else third">
Loki

NgIf zincirlenirken, bir önceki else tarafından adreslenen <ng -template> başka bir ngIf'i desteklemez. Yuvalanmış bir <ng-container> etiketi, sonraki koşulu eklemeye izin verir.
Constantin Konstantinidis

36

Sadece kullanabilirsiniz:

<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-konteyner parçası tasarımınız için önemli değilse sanırım.

İşte bir Plunker


1
Örneğim biraz basittir, ancak if (index === 1) else if (foo === 2)yazılması if (index === 1) if (index !== 1 && foo === 2)gereken, biraz dağınık ve hatalara daha yatkın olan 'else if' davranışını beklemek , daha çok ters mantık yazmak zorunda kalırız.

Plunker'a baktın mı? Sorunu gördüğümü sanmıyorum, indeks her seferinde sadece 1 şey olacak.
Dylan

Sanırım açıklaması olmayan 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
Yine de bu örnekte çok fazla karşılıklı dışlama var, ama yine de önemli olan nokta şu ki, eğer, değilse eğer ve başka, tonlarca gereksiz mantık yazmadan sadece eğer ve başka bir şey yapmam gerekiyor. Görünüşe göre Angular 4'ün şablonları bu tür bir mantıktan yoksun.

1
birkaç seçenek daha var, bu kulağa NgTemplateOutlet* ngTemplateOutlet = "drink; context: beer" gibi bir bağlamdan veya belki de kategorize etmek için başka bir bileşenden yararlanabileceğiniz gibi geliyor .
Dylan

26

Bu, yapmanın en temiz yolu gibi görünüyor

if (foo === 1) {

} else if (bar === 99) {

} else if (foo === 2) {

} else {

}

şablonda:

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

Koşullar farklı değişkenler içerdiğinde uygun bir else ififade gibi çalıştığına dikkat edin (bir seferde yalnızca 1 durum doğrudur). Diğer cevaplardan bazıları böyle bir durumda doğru çalışmıyor.

kenara: Tanrım açısal, bu gerçekten çirkin bir else ifşablon kodu ...


18

Durumunuza göre birden çok yol kullanabilirsiniz:

  1. Eğer Değişken özgü sınırlıdır Number veya dize , en iyi yolu ngSwitch veya ngIf kullanıyor:

    <!-- 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. Yukarıdaki kodlar uygun değilse, aksi takdirde kodlar ve dinamik kodlar aşağıdaki kodu kullanabilirsiniz:

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

Not: Herhangi bir format seçebilirsiniz, ancak her kodun kendi sorunları olduğunu fark edin


1
IMO 2. *ngIf="foo >= 7; then t7"yerine okunmalıdır ... else t7.
hgoebl

Sanırım ikincisi ile sadece iki satır foo >= 4 && foo <= 6; then t46; else t7çalışmalı.
Bulut

9

İç içe yerleştirmeyi ve ngSwitch'i önlemek için, Javascript'te mantıksal operatörlerin çalışma şeklini kullanan şu olasılık da vardır:

<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

<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, her zaman kullandığımız yapısal direktiflerin çoğunda kaputun altında ng-şablonu kullanıyor: ngIf, ngFor ve ngSwitch.

> Angular'da ng-şablonu nedir

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


0

Bu eski numarayı karmaşık if / then / else bloklarını biraz daha temiz bir switch ifadesine dönüştürmek için de kullanabilirsiniz:

<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>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.