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.


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>

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.


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>

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

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>

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>

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.