如何 select mat-table 中的一个单元格 (Angular 7)
How to select one cell in mat-table (Angular 7)
我正在使用 angular 材料 mat-table
来显示数据。
好吧,当您单击一个单元格时,会显示一个输入字段并隐藏 span-tag。
但就我而言,这一行中的每个单元格都显示一个输入字段,如您在屏幕截图中所见:
我的ngIf
-声明如下:
Shows span-tag: !editable || (selectedRowIdx !== idx)
Shows input-tag: editable && (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 标签?
目前您只检查一个 "coordinate",这意味着您只检查要编辑的行,而不是该行中的哪一列。因此,您无法唯一标识要编辑的单元格。
I did not find a clean solution, but
this
stackblitz shows a working solution to your problem.
当我们点击一个单元格时,我们设置当前可编辑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
这将摆脱一个函数调用)。
我正在使用 angular 材料 mat-table
来显示数据。
好吧,当您单击一个单元格时,会显示一个输入字段并隐藏 span-tag。
但就我而言,这一行中的每个单元格都显示一个输入字段,如您在屏幕截图中所见:
我的ngIf
-声明如下:
Shows span-tag: !editable || (selectedRowIdx !== idx)
Shows input-tag: editable && (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 标签?
目前您只检查一个 "coordinate",这意味着您只检查要编辑的行,而不是该行中的哪一列。因此,您无法唯一标识要编辑的单元格。
I did not find a clean solution, but this stackblitz shows a working solution to your problem.
当我们点击一个单元格时,我们设置当前可编辑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
这将摆脱一个函数调用)。