You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular表单行级编辑问题:点击修改按钮仅激活当前行而非全部行

解决单行编辑问题的方案

你当前的问题是用了全局的toggleButton变量控制所有行的编辑状态,所以点击任意一行的修改按钮,所有行都会变成可编辑状态。要实现单行独立控制,需要把编辑状态绑定到每一行的数据项上,或者跟踪当前编辑的行索引,下面提供两种可行方案:

方案一:给数据项添加编辑状态属性(推荐)

这种方案让每行数据自己管理编辑状态,支持同时编辑多行(如果后续有需求)。

1. 修改数据源初始化逻辑

确保你的dataSources中每个元素都带有isEditing属性,初始值设为true(对应初始不可编辑状态):

// 假设你的数据源初始化代码类似这样
this.dataSources = yourData.map(item => ({
  ...item,
  isEditing: true // 初始不可编辑
}));

2. 更新模板(app.component.html)

把全局的toggleButton替换为当前元素的isEditing属性,同时修改按钮的点击事件传递当前元素:

<table mat-table [dataSource]="dataSources[i]" class="mat-elevation-z0">
  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef>Nom</th>
    <td mat-cell *matCellDef="let element" matTooltip="{{ element.value }}" matTooltipClass="tooltip" matTooltipPosition="right">{{ element.name | summary: 20 }}</td>
  </ng-container>
  <ng-container matColumnDef="value">
    <th mat-header-cell *matHeaderCellDef class="align-right">Valeur</th>
    <td mat-cell *matCellDef="let element" matTooltip="{{ element.value }}" matTooltipPosition="right" matTooltipClass="tooltip" class="align-right">
        <input type="text" [disabled]="element.isEditing" placeholder="{{ element.value }}" value="{{ element.value }}" >
        <button mat-icon-button title="Modifier" (click)="enable(element)" *ngIf="element.isEditing"><mat-icon>editer</mat-icon></button>
        <button mat-icon-button title="Enregistrer" (click)="save(element)" *ngIf="!element.isEditing"><mat-icon>done</mat-icon></button>
        <button mat-icon-button title="Annuler" (click)="disable(element)" *ngIf="!element.isEditing"><mat-icon>clear</mat-icon></button>
    </td>
  </ng-container>
  <tr mat-header-row *matHeaderRowDef="['name', 'value']"></tr>
  <tr mat-row *matRowDef="let row; columns: ['name', 'value']"></tr>
</table>

3. 更新组件逻辑(app.component.ts)

修改enable和disable方法,接收当前元素并修改其编辑状态:

enable(element: any) {
  element.isEditing = false; // 开启编辑
}
disable(element: any) {
  element.isEditing = true; // 关闭编辑
}

// 可添加保存逻辑
save(element: any) {
  // 这里写保存当前元素的逻辑,比如更新数据源、调用接口等
  element.isEditing = true; // 保存后关闭编辑状态
}

方案二:跟踪当前编辑的行索引

如果只允许同时编辑一行,可以用变量记录当前编辑的行索引:

1. 更新组件逻辑(app.component.ts)

添加变量存储当前编辑索引,修改方法:

public currentEditIndex: number | null = null;

enable(index: number) {
  this.currentEditIndex = index; // 记录当前编辑的行索引
}
disable() {
  this.currentEditIndex = null; // 取消编辑
}

save(index: number) {
  // 保存逻辑
  this.currentEditIndex = null;
}

2. 更新模板(app.component.html)

在*matCellDef中获取行索引,绑定状态到索引判断:

<table mat-table [dataSource]="dataSources[i]" class="mat-elevation-z0">
  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef>Nom</th>
    <td mat-cell *matCellDef="let element" matTooltip="{{ element.value }}" matTooltipClass="tooltip" matTooltipPosition="right">{{ element.name | summary: 20 }}</td>
  </ng-container>
  <ng-container matColumnDef="value">
    <th mat-header-cell *matHeaderCellDef class="align-right">Valeur</th>
    <td mat-cell *matCellDef="let element; let index = index" matTooltip="{{ element.value }}" matTooltipPosition="right" matTooltipClass="tooltip" class="align-right">
        <input type="text" [disabled]="currentEditIndex !== index" placeholder="{{ element.value }}" value="{{ element.value }}" >
        <button mat-icon-button title="Modifier" (click)="enable(index)" *ngIf="currentEditIndex !== index"><mat-icon>editer</mat-icon></button>
        <button mat-icon-button title="Enregistrer" (click)="save(index)" *ngIf="currentEditIndex === index"><mat-icon>done</mat-icon></button>
        <button mat-icon-button title="Annuler" (click)="disable()" *ngIf="currentEditIndex === index"><mat-icon>clear</mat-icon></button>
    </td>
  </ng-container>
  <tr mat-header-row *matHeaderRowDef="['name', 'value']"></tr>
  <tr mat-row *matRowDef="let row; columns: ['name', 'value']"></tr>
</table>

内容的提问来源于stack exchange,提问作者Dabs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 13:45:51