Due valori di caso di commutazione in angolare


86

In php e java possiamo farlo

case 1:
case 2:
   echo "something";

in modo che quando il valore è 1 o 2 "qualcosa" verrà stampato sullo schermo, sto costruendo un'applicazione angolare sto facendo qualcosa di simile al seguente

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

Il modulo utilizzato per la scelta singola può essere utilizzato per la scelta multipla, ma ho provato qualcosa di simile sotto per renderlo più organizzabile

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

La mia sfortuna non ha funzionato, qualcuno può suggerire il modo migliore per farlo.


Risposte:


137

(Dis) fortunatamente non puoi; il ngSwitchè abbastanza "stupido" se guardi il codice sorgente: è solo un ===tra il valore case e il valore switch. Hai due opzioni, ma entrambe sono tutt'altro che eccezionali.

L'opzione 1 utilizza la direttiva *ngSwitchDefault, ma funzionerà solo se tutti i tuoi casi multipli sono FORM 1:

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

L'altra opzione, che è piuttosto prolissa, sta facendo qualcosa del genere:

<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
Attualmente sto seguendo il primo metodo
Niyaz

12
Vado per il secondo perché l'impostazione predefinita significa qualcos'altro, grazie per questa idea!
Sebastien DErrico

3
Lo sto lanciando là fuori, se qualcuno ha bisogno di orun Switch Case... forse hai bisogno di un *ngIfinvece di un interruttore: \
MoshMage

Il secondo approccio è fantastico.
khichar.anil

3
Può essere migliorato:*ngSwitchCase="['multi-choice', 'singe-choice'].includes(data.type) ? data.type : '' "
Maiko Kingma

60

Puoi anche usare quanto segue, che è molto più flessibile. È quindi possibile inserire tutto ciò che restituisce booleano come valore * ngSwitchCase.

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

Il vantaggio che questo ha rispetto all'uso dei blocchi * ngIf è che puoi ancora specificare un valore predefinito.


46

Puoi usare ngTemplateOutletper implementare questo:

<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
Questa è di gran lunga la soluzione più pulita e meno hacker. È anche suggerito nei documenti : "Ogni istruzione switch-case contiene un modello HTML in linea o un riferimento al modello"
t.animal

1
Questa soluzione dà il risultato più pulito. Grazie!
cuddlemeister

1
Un avvertimento: il contenuto di #form1verrà rieseguito tra switchCase 1 e 2. Per molti questo non avrà importanza, ma se il componente è complesso, per ora è meglio con un * ngIf.
Jesse,

16

Come suggerito da MoshMage , ho finito per usare un *ngIfper gestire questo per i componenti che gestivano molte delle opzioni:

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

16

Ecco una variazione che combina la seconda risposta di Fabio con quella di brian3kb per produrre una soluzione più condensata senza offuscare il significato.

Se sono presenti più corrispondenze per un caso, utilizza array.includes()invece di confrontare ciascuna opzione singolarmente.

È particolarmente utile se ci sono più di due corrispondenze poiché sarà molto più condensato rispetto alla risposta accettata.

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

Se le corrispondenze si trovano in una variabile, è possibile utilizzare array.indexOf()per evitare l'uso dell'operatore ternario condizionale.

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

1

Si prega di provare ng-switch-when-separator="|"ang-switch

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

5
Si noti che questa direttiva è una caratteristica di AngularJS (aka v1), non di Angular (aka v2 or higher). Sebbene sia stato richiesto in passato, non è ancora fornito su nessuna versione da Angular 2 ad Angular 9 (alla data di questo commento).
NunoM

1

Ecco come lo farei:

Nel tuo .component.ts:

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

Quindi, nel tuo file modello, puoi fare qualcosa del genere:

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

Attenzione però agli errori di battitura ...

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.