angular2中的两个开关盒值

Niy*_*yaz 45 angular

在php和java中我们可以做到

case 1:
case 2:
   echo "something";
Run Code Online (Sandbox Code Playgroud)

这样,当值为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>
Run Code Online (Sandbox Code Playgroud)

用于单一选择的表单可用于多种选择,但我尝试了类似下面的内容,使其更具有组织性

<div [ngSwitch]="data.type">
  <div *ngSwitchCase="'multi-choice' || 'singe-choice'">FORM 1</div>
</div>
Run Code Online (Sandbox Code Playgroud)

我的运气不好,没有用,任何人都可以建议更好的方法来做到这一点.

Fab*_*nes 92

(联合国)幸运的是你不能,ngSwitch如果你看一下源代码,它就会非常"愚蠢",它只是===在案例值和开关值之间.你有两种选择,但两者都不是很好.

选项1正在使用该指令*ngSwitchDefault,但这只有在您的所有多个案例都是FORM 1时才有效:

<div [ngSwitch]="data.type">
  <div *ngSwitchDefault>FORM 1</div>
  <div *ngSwitchCase="'range'">FORM 2</div>
</div>
Run Code Online (Sandbox Code Playgroud)

另一个相当冗长的选项就是做这样的事情:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 可以改进:`*ngSwitchCase="['multi-choice', 'singe-choice'].includes(data.type) ? data.type : '' "` (6认同)
  • 我要去的第二个,因为默认是其他的意思,谢谢你的想法! (5认同)
  • 目前我正在遵循第一种方法 (2认同)
  • 我把它扔在那里,如果有人需要`或`Switch Case` ...也许你需要`* ngIf`而不是switch:\ (2认同)

esc*_*sam 41

您还可以使用以下内容,这样更灵活.然后,您可以将评估为boolean的任何内容作为*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>
Run Code Online (Sandbox Code Playgroud)

这比使用*ngIf块的优点是您仍然可以指定默认值.


Dan*_*lii 18

您可以使用ngTemplateOutlet实现此功能

<ng-container [ngSwitch]="variable">
   <ng-container *ngSwitchCase="1">
      <ng-container *ngTemplateOutlet="firstAndSecond"></ng-container>
   </ng-container>
   <ng-container *ngSwitchCase="2">
      <ng-container *ngTemplateOutlet="firstAndSecond"></ng-container>
   </ng-container>
   <ng-container *ngSwitchCase="3">
      some html
   </ng-container>
   <ng-container *ngSwitchDefault>
      another html
   </ng-container>
   <ng-template #firstAndSecond>
      html
   </ng-template>
</ng-container>
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这是最干净,最安全的解决方案。[docs](https://angular.io/api/common/NgSwitchCase)中也暗示了这一点:“每个switch-case语句都包含一个内联HTML模板或模板引用” (2认同)
  • 该解决方案给出了最干净的结果。谢谢你! (2认同)

小智 14

就像MoshMage建议的那样,我最终使用了一个*ngIf来处理这个处理几个选项的组件:

 *ngIf="['Transformation', 'Field Mapping', 'Filter'].includes(selectedWorkflow.type)"
Run Code Online (Sandbox Code Playgroud)


Dan*_*nez 12

这是一个将Fabio的第二个答案与brian3kb相结合的变体,以产生一个更加简洁的解决方案而不会混淆意义.

如果它使用的案例有多个匹配项,array.includes()而不是单独比较每个选项.

如果有两个以上的匹配则特别有用,因为它相对于接受的答案会更加精确.

<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>
Run Code Online (Sandbox Code Playgroud)

如果匹配碰巧在变量中,则可以使用array.indexOf()以避免使用条件三元运算符.

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


小智 12

可以使用ngTemplateOutlet指令来实现:

<ng-container [ngSwitch]="colour">
    <ng-container *ngSwitchCase="'green'">:)</ng-container>
    <ng-container *ngSwitchCase="'yellow'">;)</ng-container>
    <ng-container *ngSwitchCase="'black'" [ngTemplateOutlet]="sad"></ng-container>
    <ng-container *ngSwitchCase="'darkgrey'" [ngTemplateOutlet]="sad"></ng-container>
</ng-container>

<ng-template #sad>:(</ng-template>
Run Code Online (Sandbox Code Playgroud)


小智 5

使用ngFor

<ng-container [ngSwitch]="column">
  <ng-container *ngFor="let numeric of ['case1', 'case2']">
    <ng-container *ngSwitchCase="numeric">
      {{ element[column] | currency }}
    </ng-container>
  </ng-container>
</ng-container>
Run Code Online (Sandbox Code Playgroud)