【问题标题】:Two switch case values in angular角度中的两个开关盒值
【发布时间】:2023-03-31 14:48:02
【问题描述】:

在php和java中我们可以做到

case 1:
case 2:
   echo "something";

所以当值为 1 或 2 时“某物”将打印在屏幕上,我正在构建一个 Angular 应用程序,我正在执行类似下面的操作

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

我的运气不好,它没有工作,任何人都可以提出更好的方法来做到这一点。

【问题讨论】:

标签: angular


【解决方案1】:

(不)幸运的是你不能;如果查看源代码,ngSwitch 是相当“愚蠢”的:它只是 case 值和 switch 值之间的 ===。你有两个选择,但都不是很好。

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

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

另一个非常冗长的选项是这样做的:

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

【讨论】:

  • 目前我采用的是第一种方法
  • 我选择第二个,因为默认值有别的含义,谢谢你的想法!
  • 如果有人需要 orSwitch Case ... 也许你需要 *ngIf 而不是开关:\
  • 第二种方法很棒。
  • 可以改进:*ngSwitchCase="['multi-choice', 'singe-choice'].includes(data.type) ? data.type : '' "
【解决方案2】:

你可以使用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 仍然有 considering 这样的功能,但还有 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>

【讨论】:

  • 这是迄今为止最干净、最简单的解决方案。 the docs 中也暗示了这一点:“每个 switch-case 语句都包含一个内联 HTML 模板或模板引用”
  • 这个解决方案给出了最干净的结果。谢谢!
  • 一句警告:#form1 的内容将在 switchCase 1 和 2 之间重新渲染。对于许多人来说这无关紧要,但如果组件很复杂,那么现在你是最好使用 *ngIf。
  • 最佳解决方案...
【解决方案3】:

您还可以使用以下内容,这更加灵活。然后,您可以将计算结果为布尔值的任何内容作为 *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 块相比,它的优点是您仍然可以指定默认值。

【讨论】:

  • 这个对我有用,但切换“真实”语句很奇怪。
【解决方案4】:

这是一个变体,将 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>

如果匹配项恰好在一个变量中,您可以使用array.indexOf() 来避免使用条件三元运算符。

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

【讨论】:

    【解决方案5】:

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

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

    【讨论】:

      【解决方案6】:

      可以使用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>
      

      【讨论】:

        【解决方案7】:

        我会这样做:

        在你的.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>
        

        注意错别字...

        【讨论】:

          【解决方案8】:

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

          【讨论】:

          • 嗨,欢迎来到 Stack Overflow。正如tour 中所述,该站点是有用问题及其答案的存储库。您的答案是(包含在)/(非常类似于)[此答案](链接/到/答案),并且不是很有用,因为它不会添加任何新的价值或信息。请避免写重复的答案。编辑您的答案以增加价值或完全删除它;这将确保网站上的所有问题和答案都是有用的,不会分散/重复。
          【解决方案9】:

          请在ng-switch 中尝试ng-switch-when-separator="|"

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

          【讨论】:

          • 请注意,该指令是 AngularJS (aka v1) 的一个特性,而不是 Angular (aka v2 or higher)。尽管过去曾提出过要求,但从 Angular 2 到 Angular 9 的任何版本(截至本文发表之日)都没有提供它。
          【解决方案10】:
          <ng-container *ngIf="['text', 'email', 'password', 'number'].includes(f.type!)">
              <mat-form-field>
                   <mat-label>{{f.placeholder}}</mat-label>
                   <input matInput [attr.type]="f.type" [formControlName]="f.name!">
             </mat-form-field>
          </ng-container>
          

          【讨论】:

            【解决方案11】:

            The Fabio Antunes's second answer,但带有管道:

            import { Pipe, PipeTransform } from '@angular/core';
            
            @Pipe({
              name: 'multiSwitchCase',
            })
            export class MultiSwitchCasePipe implements PipeTransform {
              transform<T = any>(cases: T[], value: T): T {
                return cases.includes(value) ? value : cases[0];
              }
            }
            
            <div [ngSwitch]="data.type">
              <div *ngSwitchCase="['multi-choice', 'singe-choice'] | multiSwitchCase: data.type">
                FORM 1
              </div>
            </div>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-05-15
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-07-14
              • 2015-10-27
              相关资源
              最近更新 更多