如何在垫子表格中选择一个单元格(角度7)

时间:2019-04-10 09:23:04

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

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

但就我而言,此行中的每个单元格都显示一个输入字段,如屏幕截图所示:

enter image description here

我的ngIf声明如下:

  

显示span标签:!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标签?

1 个答案:

答案 0 :(得分: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来摆脱一个函数调用)。