【问题标题】:How to select one cell in mat-table (Angular 7)如何在 mat-table 中选择一个单元格(Angular 7)
【发布时间】:2019-04-10 18:38:46
【问题描述】:

我正在使用角度材料mat-table 来显示数据。 好吧,当您单击一个单元格时,会显示一个输入字段,并且 span-tag 会隐藏。

但就我而言,这一行中的每个单元格都显示了一个输入字段,正如您在屏幕截图中看到的那样:

我的ngIf-Statement 如下:

显示跨度标签:!editable || (selectedRowIdx !== idx)

显示输入标签:可编辑 && (selectedRowIdx == idx)

<ng-container matColumnDef="TYPE">
  <mat-header-cell *matHeaderCellDef> TYPE </mat-header-cell>
  <mat-cell *matCellDef="let elem; let idx = index" (click)="testFocusIn(elem.TYPE)">
    <span *ngIf="!editable || (selectedRowIdx !== idx)">{{elem.TYPE}}</span>
    <mat-form-field *ngIf="editable && (selectedRowIdx == idx)"> 
      <input matInput [(ngModel)]="elem.TYPE" [appAutoFocus]="(focus === elem.TYPE)">
    </mat-form-field>
  </mat-cell>
</ng-container>

<ng-container matColumnDef="NAME">
  <mat-header-cell *matHeaderCellDef> NAME </mat-header-cell>
  <mat-cell *matCellDef="let elem; let idx = index" (click)="testFocusIn(elem.NAME)">
    <span *ngIf="!editable || (selectedRowIdx !== idx)">{{elem.NAME}}</span>
    <mat-form-field *ngIf="editable && (selectedRowIdx == idx)"> 
      <input matInput [(ngModel)]="elem.NAME" [appAutoFocus]="(focus === elem.NAME)">
    </mat-form-field>
  </mat-cell>
</ng-container>

我还能检查什么?也许要定义一个 ID 标签?

【问题讨论】:

    标签: angular angular7 mat-table angular-material-7


    【解决方案1】:

    目前您只检查一个“坐标”,这意味着您只检查要编辑的行,而不是该行中的哪一列。因此,您无法唯一标识要编辑的单元格。

    我没有找到干净的解决方案,但是 this stackblitz 为您的问题提供了一个可行的解决方案。

    当我们点击一​​个单元格时,我们设置了当前可编辑的index和当前可编辑的column。这有助于我们唯一标识要编辑的单元格。

    <ng-container matColumnDef="name">
      <th mat-header-cell *matHeaderCellDef> Name </th>
      <td mat-cell *matCellDef="let element; let i = index;" (click)="edit(i, 'name')">
        <span *ngIf="showValue(i, 'name')">{{element.name}}</span>
        <mat-form-field *ngIf="showInput(i, 'name')"> 
          <input matInput placeholder="Placeholder">
        </mat-form-field>
      </td>    
    </ng-container>
    

    在组件中

    edit(index: number, column: string) {
      this.editableColumn = column;
      this.editableIndex = index;
    }
    
    showInput(index: number, column: string) {
      return this.editableColumn === column && this.editableIndex === index;
    }
    
    showValue(index: number, column: string) {
      return this.editableColumn !== column || this.editableIndex !== index;
    }
    

    从某种意义上说,我们必须将模板中的 column 名称 3 次传递给函数,并且所有函数调用都对模板造成了相当大的污染,这有点难看。但我确信通过一些重构,您可以提出一个干净的解决方案(一种简化是使用模板变量和ng-template,这将摆脱一个函数调用)。

    【讨论】:

    • 感谢您的回答。它有助于我的方法。如果有人有更好的解决方案,请告诉我:)
    猜你喜欢
    • 2020-03-24
    • 2018-11-02
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 1970-01-01
    • 2021-02-08
    • 2019-08-23
    • 2019-11-14
    相关资源
    最近更新 更多