Deux valeurs de boîtier de commutation en angulaire

86

En php et java, nous pouvons faire

case 1:
case 2:
   echo "something";

de sorte que lorsque la valeur est 1 ou 2 "quelque chose" sera imprimé à l'écran, je construis une application angulaire je fais quelque chose comme ci-dessous

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

Le formulaire qui est utilisé pour le choix unique peut être utilisé pour un choix multiple, mais j'ai essayé quelque chose comme ci-dessous pour le rendre plus organisable

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

Ma malchance, cela n'a pas fonctionné, quelqu'un peut-il suggérer la meilleure façon de le faire.

Niyaz
la source

Réponses:

137

(Un) heureusement vous ne pouvez pas; le ngSwitchest assez «stupide» si vous regardez le code source: c'est juste un ===entre la valeur de cas et la valeur de commutateur. Vous avez deux options, mais les deux sont loin d'être excellentes.

L'option 1 utilise la directive *ngSwitchDefault, mais cela ne fonctionnera que si tous vos cas multiples sont de FORMULE 1:

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

L'autre option, qui est assez verbeuse, fait quelque chose comme ceci:

<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>
Fabio Antunes
la source
2
Actuellement, je suis la première méthode
Niyaz
12
J'y vais pour le second car le défaut veut dire autre chose, merci pour cette idée!
Sebastien DErrico
3
Je lance ça là-bas, si quelqu'un a besoin d' orun Switch Case... peut-être que vous avez besoin *ngIfd'un commutateur au lieu d'un interrupteur: \
MoshMage
La deuxième approche est géniale.
khichar.anil
3
Peut être amélioré:*ngSwitchCase="['multi-choice', 'singe-choice'].includes(data.type) ? data.type : '' "
Maiko Kingma
60

Vous pouvez également utiliser ce qui suit, qui est beaucoup plus flexible. Vous pouvez ensuite mettre tout ce qui évalue booléen comme valeur * 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>

L'avantage de cela par rapport à l'utilisation des blocs * ngIf est que vous pouvez toujours spécifier une valeur par défaut.

escapisam
la source
46

Vous pouvez utiliser ngTemplateOutletpour implémenter ceci:

<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>
Daniil Palii
la source
7
C'est de loin la solution la plus propre et la moins piratée. Il est également indiqué dans la documentation : "Chaque instruction switch-case contient un modèle HTML en ligne ou une référence de modèle"
t.animal
1
Cette solution donne le résultat le plus propre. Merci!
cuddlemeister
1
Un mot d'avertissement: le contenu de #form1sera de nouveau rendu entre switchCase 1 et 2. Pour beaucoup, cela n'aura pas d'importance, mais si le composant est complexe, alors pour l'instant, il vaut mieux utiliser un * ngIf.
Jesse
16

Comme MoshMage l'a suggéré, j'ai fini par utiliser un *ngIfpour gérer cela pour les composants qui géraient plusieurs des options:

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

Voici une variante qui combine la deuxième réponse de Fabio avec celle de brian3kb pour produire une solution plus condensée sans obscurcir le sens.

S'il existe plusieurs correspondances pour un cas, il utilise array.includes()au lieu de comparer chaque option individuellement.

Il est particulièrement utile s'il y a plus de deux correspondances car il sera beaucoup plus condensé par rapport à la réponse acceptée.

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

Si les correspondances se trouvent dans une variable, vous pouvez utiliser array.indexOf()pour éviter l'utilisation de l'opérateur ternaire conditionnel.

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

S'il vous plaît essayer ng-switch-when-separator="|"deng-switch

<div ng-switch="temp">
    <div ng-switch-when="1|2" ng-switch-when-separator="|"> echo "something"</div>
</div>
Salman Laei
la source
5
Veuillez noter que cette directive est une fonctionnalité d'AngularJS (aka v1)et non d'Angular (aka v2 or higher). Même s'il a été demandé dans le passé, il n'est encore fourni sur aucune version d'Angular 2 à Angular 9 (à la date de ce commentaire).
NunoM
1

Voici comment je le ferais:

Dans votre .component.ts:

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

Ensuite, dans votre fichier de modèle, vous pouvez faire quelque chose comme ceci:

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

Attention cependant aux fautes de frappe ...

Andrei Cojea
la source