Zwei Schaltergehäusewerte im Winkel


86

In PHP und Java können wir tun

case 1:
case 2:
   echo "something";

Wenn der Wert 1 oder 2 ist, wird "etwas" auf dem Bildschirm gedruckt. Ich erstelle eine Winkelanwendung. Ich mache etwas wie das Folgende

<div [ngSwitch]="data.type">
  <div *ngSwitchCase="'multi-choice'">FORM 1</div>
  <div *ngSwitchCase="'singe-choice'">FORM 1</div>
  <div *ngSwitchCase="'range'">FORM 2</div>
</div>

Das Formular, das für die Einzelauswahl verwendet wird, kann für die Mehrfachauswahl verwendet werden, aber ich habe etwas wie das Folgende versucht, um es organisierbarer zu machen

<div [ngSwitch]="data.type">
  <div *ngSwitchCase="'multi-choice' || 'singe-choice'">FORM 1</div>
</div>

Mein Pech, es hat nicht funktioniert, kann jemand den besseren Weg vorschlagen, dies zu tun.


Antworten:


138

(Un) zum Glück kannst du nicht; Das ngSwitchist ziemlich "dumm", wenn man sich den Quellcode ansieht: Es ist nur ein ===Wert zwischen dem Fallwert und dem Schaltwert. Sie haben zwei Möglichkeiten, aber beide sind alles andere als großartig.

Option 1 verwendet die Direktive *ngSwitchDefault, dies funktioniert jedoch nur, wenn alle Ihre Mehrfachfälle FORMULAR 1 sind:

<div [ngSwitch]="data.type">
  <div *ngSwitchDefault>FORM 1</div>
  <div *ngSwitchCase="'range'">FORM 2</div>
</div>

Die andere Option, die ziemlich ausführlich ist, macht so etwas:

<div [ngSwitch]="data.type">
  <div *ngSwitchCase="data.type === 'multi-choice' || data.type === 'singe-choice' ? data.type : '' ">FORM 1</div>
  <div *ngSwitchCase="'range'">FORM 2</div>
</div>

2
Derzeit folge ich der ersten Methode
Niyaz

12
Ich gehe zum zweiten, weil der Standard etwas anderes bedeutet, danke für diese Idee!
Sebastien DErrico

3
Ich werfe das da raus, wenn jemand oreinen Switch Case... vielleicht brauchst du einen *ngIfanstelle eines Schalters: \
MoshMage

Der zweite Ansatz ist fantastisch.
Khichar.anil

3
Kann verbessert werden:*ngSwitchCase="['multi-choice', 'singe-choice'].includes(data.type) ? data.type : '' "
Maiko Kingma

60

Sie können auch Folgendes verwenden, das viel flexibler ist. Sie können dann alles, was als boolescher Wert ausgewertet wird, als * ngSwitchCase-Wert festlegen.

<div [ngSwitch]="true">
    <div *ngSwitchCase="data.type === 'multi-choice' || data.type === 'singe-choice'">FORM 1</div>
    <div *ngSwitchCase="data.type === 'range'">FORM 2</div>
    <div *ngSwitchDefault>FORM 3</div>
</div>

Der Vorteil gegenüber der Verwendung von * ngIf-Blöcken besteht darin, dass Sie weiterhin einen Standard angeben können.


46

Sie können dies verwenden ngTemplateOutlet, um Folgendes zu implementieren:

<ng-container [ngSwitch]="variable">
    <ng-container *ngSwitchCase="1">
        <ng-container *ngTemplateOutlet="form1"></ng-container>
    </ng-container>
    <ng-container *ngSwitchCase="2">
        <ng-container *ngTemplateOutlet="form1"></ng-container>
    </ng-container>
    <ng-container *ngSwitchCase="3">FORM 2</ng-container>
    <ng-container *ngSwitchDefault>FORM 3</ng-container>
    <ng-template #form1>FORM 1</ng-template>
</ng-container>

7
Dies ist bei weitem die sauberste und am wenigsten hackige Lösung. In den Dokumenten wird auch darauf hingewiesen : "Jede switch-case-Anweisung enthält eine Inline-HTML-Vorlage oder eine Vorlagenreferenz"
t.animal

1
Diese Lösung liefert das sauberste Ergebnis. Vielen Dank!
Cuddlemeister

1
Ein Wort der Warnung: Der Inhalt von #form1wird zwischen switchCase 1 und 2 neu gerendert. Für viele spielt dies keine Rolle, aber wenn die Komponente komplex ist, sind Sie mit einem * ngIf vorerst besser dran.
Jesse

17

Hier ist eine Variante, die Fabios zweite Antwort mit brian3kb kombiniert, um eine kondensiertere Lösung zu erhalten, ohne die Bedeutung zu verschleiern.

Wenn es für einen Fall mehrere Übereinstimmungen gibt, wird diese verwendet, array.includes()anstatt jede Option einzeln zu vergleichen.

Es ist besonders nützlich, wenn es mehr als zwei Übereinstimmungen gibt, da es im Vergleich zur akzeptierten Antwort viel komprimierter ist.

<div [ngSwitch]="data.type">
   <div *ngSwitchCase="['multi-choice', 'singe-choice'].includes(data.type) ? data.type : ''">FORM 1</div>
   <div *ngSwitchCase="'range'">FORM 2</div>
   <div *ngSwitchDefault>FORM 3</div>
</div>

Wenn sich die Übereinstimmungen zufällig in einer Variablen befinden, können Sie array.indexOf()die Verwendung des bedingten ternären Operators vermeiden.

<div [ngSwitch]="data.type">
  <div *ngSwitchCase="matches[matches.indexOf(data.type)]">FORM 1</div>
  <!-- ... -->
</div>

16

Wie von MoshMage vorgeschlagen, habe ich letztendlich ein verwendet *ngIf, um dies für die Komponenten zu handhaben, die mehrere der Optionen handhabten:

 *ngIf="['Transformation', 'Field Mapping', 'Filter'].includes(selectedWorkflow.type)"

1

Bitte versuchen Sie es ng-switch-when-separator="|"inng-switch

<div ng-switch="temp">
    <div ng-switch-when="1|2" ng-switch-when-separator="|"> echo "something"</div>
</div>

5
Bitte beachten Sie, dass diese Anweisung eine Funktion von AngularJS ist (aka v1), nicht von Angular (aka v2 or higher). Obwohl es in der Vergangenheit angefordert wurde, ist es in keiner Version von Angular 2 bis Angular 9 (zum Datum dieses Kommentars) noch verfügbar.
NunoM

1

So würde ich es machen:

In Ihrem .component.ts:

getFormType(type: string) {
  switch(type) {
    case 'singe-choice':
    case 'multi-choice':
      return 'singe-choice|multi-choice'
    default:
      return type;
  }
}

Dann können Sie in Ihrer Vorlagendatei Folgendes tun:

<div [ngSwitch]="getFormType(data.type)">
   <div *ngSwitchCase="'singe-choice|multi-choice'">FORM 1</div>
   <div *ngSwitchCase="'range'">FORM 2</div>
   <div *ngSwitchDefault>FORM 3</div>
</div>

Achten Sie jedoch auf Tippfehler ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.