В настоящее время вы проверяете только одну «координату», то есть вы проверяете только строку, которую хотите отредактировать, но не столбец в этой строке.Поэтому вы не можете однозначно определить ячейку для редактирования.
Я не нашел чистого решения, но этот 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
, что избавило бы от одного вызова функции).