角度の2つのスイッチケース値


87

PHPとJavaでは次のことができます

case 1:
case 2:
   echo "something";

値が1または2の場合、「何か」が画面に出力されるように、角度のあるアプリケーションを構築しています。次のようなことをしています。

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

単一選択に使用されるフォームは複数選択にも使用できますが、より整理しやすくするために以下のようなものを試しました

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

私の不運はうまくいきませんでした、誰かがこれを行うためのより良い方法を提案できますか?


回答:


145

(残念ながら)できません。ngSwitchソースコードを見ると、これはかなり「ばかげている」です。これ===は、ケース値とスイッチ値の中間にすぎません。2つの選択肢がありますが、どちらも素晴らしいとは言えません。

オプション1はディレクティブを使用して*ngSwitchDefaultいますが、これは複数のケースがすべてFORM1の場合にのみ機能します。

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

非常に冗長なもう1つのオプションは、次のようなことです。

<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
現在、私は最初の方法に従っています
Niyaz 2016年

13
デフォルトは別の意味であるため、2番目に進みます。このアイデアに感謝します!
Sebastien DErrico 2017年

4
誰かがする必要がorある場合、私はこれをそこに投げていSwitch Caseます...多分あなた*ngIfはスイッチの代わりに必要です:\
MoshMage 2017

2番目のアプローチは素晴らしいです。
khichar.anil 2017

4
改善できる:*ngSwitchCase="['multi-choice', 'singe-choice'].includes(data.type) ? data.type : '' "
舞妓キングマ2018年

62

以下を使用することもできますが、これははるかに柔軟性があります。次に、ブール値と評価されるものを* 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>

* ngIfブロックを使用するよりも優れている点は、デフォルトを指定できることです。


47

ngTemplateOutletこれを実装するために使用できます:

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

更新

Angularはまだそのような機能を検討していますが、jonrimmerのswitch-cases.directive.tsがあります。使用例:

<ng-container [ngSwitch]="variable">
    <ng-container *jrSwitchCases="[1, 2]">FORM 1</ng-container>
    <ng-container *ngSwitchCase="3">FORM 2</ng-container>
    <ng-container *ngSwitchDefault>FORM 3</ng-container>
</ng-container>


8
これは、これまでで最もクリーンでハックの少ないソリューションです。また、中に示唆されたドキュメント:「各スイッチ-case文は、インラインHTMLテンプレートまたはテンプレートの参照が含まれています」
t.animal

2
このソリューションは、最もクリーンな結果をもたらします。ありがとうございました!
cuddlemeister

1
警告の一言:の内容は#form1switchCase 1と2の間で再レンダリングされます。多くの場合、これは問題ではありませんが、コンポーネントが複雑な場合は、今のところ* ngIfを使用することをお勧めします。
ジェシー

17

これは、Fabioの2番目の回答とbrian3kbの回答を組み合わせて、意味をわかりにくくすることなく、より凝縮されたソリューションを生成するバリエーションです。

ケースに複数の一致がある場合はarray.includes()、各オプションを個別に比較する代わりに使用します。

受け入れられた回答に比べてはるかに凝縮されるため、3つ以上の一致がある場合に特に役立ちます。

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

一致が変数内にある場合はarray.indexOf()、を使用して、条件付き三項演算子の使用を回避できます。

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

16

同様MoshMageは、私が使用して終了し、提案され*ngIfたオプションのいくつかを取り扱う部品のためにこれを処理するために:

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

1

試してみてくださいng-switch-when-separator="|"ng-switch

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

5
このディレクティブはAngularJSの機能であり(aka v1)、Angularではないことに注意してください(aka v2 or higher)。過去にリクエストされたものの、Angular2からAngular9(このコメントの日付)までのどのバージョンでもまだ提供されていません。
NunoM

1

これが私がそれをする方法です:

あなたの.component.ts

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

次に、テンプレートファイルで、次のような操作を実行できます。

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

ただし、タイプミスに注意してください...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.