Dwie wartości obudowy przełącznika pod kątem

86

W php i java możemy to zrobić

case 1:
case 2:
   echo "something";

więc gdy wartość to 1 lub 2 "coś" zostanie wydrukowane na ekranie, buduję aplikację kątową robię coś takiego jak poniżej

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

Formularz używany do pojedynczego wyboru może być używany do wielokrotnego wyboru, ale spróbowałem czegoś takiego jak poniżej, aby uczynić go bardziej zorganizowanym

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

Mój pech to nie zadziałało, czy ktoś może zasugerować lepszy sposób na zrobienie tego.

Niyaz
źródło

Odpowiedzi:

137

(Nie) na szczęście nie możesz; ngSwitchjest dość „głupi”, jeśli spojrzeć na kod źródłowy: to tylko ===między wartością a wartością przypadku przełącznika. Masz dwie opcje, ale obie nie są świetne.

Opcja 1 korzysta z dyrektywy *ngSwitchDefault, ale zadziała to tylko wtedy, gdy wszystkie Twoje wielokrotne sprawy to FORMULARZ 1:

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

Inna opcja, która jest dość rozwlekła, robi coś takiego:

<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
źródło
2
Obecnie
stosuję
12
Idę po drugie, ponieważ domyślnie oznacza coś innego, dziękuję za ten pomysł!
Sebastien DErrico
3
Ja to wyrzucanie tam, jeśli ktoś musi ... może potrzebować zamiast przełącznika: \orSwitch Case*ngIf
MoshMage
Drugie podejście jest niesamowite.
khichar.anil
3
Można poprawić:*ngSwitchCase="['multi-choice', 'singe-choice'].includes(data.type) ? data.type : '' "
Maiko Kingma
60

Możesz także użyć poniższego, który jest o wiele bardziej elastyczny. Następnie możesz umieścić wszystko, co ma wartość logiczną, jako wartość * 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>

Zaletą tego rozwiązania w stosunku do bloków * ngIf jest to, że nadal można określić wartość domyślną.

escapisam
źródło
46

Możesz użyć ngTemplateOutletdo zaimplementowania tego:

<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
źródło
7
To zdecydowanie najczystsze i najmniej hakerskie rozwiązanie. Jest to również wskazane w dokumentach : „Każda instrukcja przełączania przypadku zawiera wbudowany szablon HTML lub odwołanie do szablonu”
t.animal
1
To rozwiązanie daje najczystszy efekt. Dziękuję Ci!
cuddlemeister
1
Jedno słowo ostrzeżenia: zawartość #form1będzie ponownie renderowana między switchCase 1 i 2. Dla wielu nie ma to znaczenia, ale jeśli komponent jest złożony, to na razie lepiej będzie z * ngIf.
Jesse
17

Oto odmiana, która łączy drugą odpowiedź Fabio z brian3kb, aby uzyskać bardziej skondensowane rozwiązanie bez zaciemniania znaczenia.

Jeśli istnieje wiele dopasowań dla sprawy, używa array.includes()zamiast porównywać każdą opcję indywidualnie.

Jest to szczególnie przydatne w przypadku więcej niż dwóch dopasowań, ponieważ będzie znacznie bardziej skondensowane w stosunku do zaakceptowanej odpowiedzi.

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

Jeśli dopasowania znajdują się w zmiennej, możesz użyć, array.indexOf()aby uniknąć stosowania warunkowego operatora trójskładnikowego.

<div [ngSwitch]="data.type">
  <div *ngSwitchCase="matches[matches.indexOf(data.type)]">FORM 1</div>
  <!-- ... -->
</div>
Daniel Gimenez
źródło
16

Jak zasugerował MoshMage , ostatecznie użyłem programu *ngIfdo obsługi tego dla komponentów, które obsługiwały kilka opcji:

 *ngIf="['Transformation', 'Field Mapping', 'Filter'].includes(selectedWorkflow.type)"
brian3kb
źródło
1

Spróbuj ng-switch-when-separator="|"wng-switch

<div ng-switch="temp">
    <div ng-switch-when="1|2" ng-switch-when-separator="|"> echo "something"</div>
</div>
Salman Laei
źródło
5
Zauważ, że ta dyrektywa jest funkcją AngularJS (aka v1), a nie Angular (aka v2 or higher). Mimo że w przeszłości było to wymagane, nie jest jeszcze dostępne w żadnej wersji od Angular 2 do Angular 9 (w dniu tego komentarza).
NunoM
1

Oto jak bym to zrobił:

W twoim .component.ts:

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

Następnie w pliku szablonu możesz zrobić coś takiego:

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

Uważaj jednak na literówki ...

Andrei Cojea
źródło