web-dev-qa-db-fra.com

* ngSi d'autre si dans le template

Comment pourrais-je avoir plusieurs cas dans une instruction *ngIf? Je suis habitué à Vue ou Angular 1 avec un if, else if et else, mais il semble que Angular 4 n’a que les conditions true (if) et false (else).

Selon la documentation, je ne peux faire que:

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

Mais je veux avoir plusieurs conditions (quelque chose comme):

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

Mais je finis par devoir utiliser ngSwitch, qui ressemble à un hack:

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

Alternativement, il semble que beaucoup de syntaxes auxquelles je suis habitué de Angular 1 et Vue ne soient pas prises en charge dans Angular 4, être le moyen recommandé de structurer mon code avec des conditions comme celle-ci?

61
CmdrShepardsPie

Une autre alternative est de nidifier les conditions

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

Vous pouvez simplement utiliser:

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

sauf si la partie ng-container est importante pour votre conception, je suppose.

Voici un Plunker

29
Dylan

Cela semble être le moyen le plus propre de faire

if (foo === 1) {

} else if (bar === 99) {

} else if (foo === 2) {

} else {

}

dans le modèle:

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

Notez que fonctionne comme une instruction else if appropriée devrait) lorsque les conditions impliquent différentes variables (un seul cas est vrai à la fois). Certaines des autres réponses ne fonctionnent pas correctement dans un tel cas.

à part: gosh angular, c'est vraiment un très mauvais else if code de modèle ...

20
goat

Vous pouvez utiliser plusieurs méthodes basées sur sitaution:

  1. Si votre variable est limitée à un nombre spécifique Number ou String , en utilisant ngSwitch ou 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. Ci-dessus ne convient pas pour si elseif sinon codes et codes dynamiques, vous pouvez utiliser le code ci-dessous:

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

Remarque: vous pouvez choisir n’importe quel format, mais vous remarquerez que chaque code a ses propres problèmes.

13
Sina Lotfi