You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在启用单元格编辑的Ag Grid表格中点击特定按钮重置行内所有用户修改?

实现AG Grid行级撤销修改的方案

嘿,这个需求我之前在项目里刚好踩过坑,AG Grid本身就提供了很贴合的方式来处理行内修改的撤销,下面给你一步步拆解实现方式:

核心逻辑

AG Grid的每个行节点(Row Node)会自动保存两份数据:初始加载的原始数据存在rowNode.dataOriginal里,用户修改后的当前数据存在rowNode.data里。我们要做的就是点击按钮时,把当前行的数据重置回原始版本,再同步刷新界面即可。

具体实现步骤

1. 给每行添加撤销按钮列

首先在列定义里新增一个自定义操作列,用来放置撤销按钮:

const columnDefs = [
  // 你的其他业务列定义...
  {
    headerName: '操作',
    cellRenderer: params => {
      const undoBtn = document.createElement('button');
      undoBtn.innerText = '撤销修改';
      undoBtn.style.padding = '4px 8px';
      // 点击时传入当前行的rowNode到处理函数
      undoBtn.onclick = () => handleUndoRow(params.node);
      return undoBtn;
    },
    width: 120,
    suppressMenu: true
  }
];

2. 编写撤销操作的核心函数

这里要处理两种场景:当前行有没有单元格处于编辑状态,然后完成数据重置和界面刷新:

const handleUndoRow = (rowNode) => {
  // 第一步:如果当前行有单元格正在编辑,先终止编辑
  if (rowNode.isEditing()) {
    rowNode.stopEditing();
  }

  // 第二步:把当前行的数据重置为原始数据
  rowNode.setData(rowNode.dataOriginal);

  // 第三步:强制刷新该行所有单元格,确保界面同步更新
  rowNode.refreshCells({
    force: true // 强制跳过缓存,避免界面不更新
  });

  // 额外:如果你的数据源是响应式状态(比如React/Vue的state),还要同步更新数据源
  // 举个React的例子:
  // const updatedRows = [...rowData];
  // const targetIndex = updatedRows.findIndex(item => item.id === rowNode.data.id);
  // updatedRows[targetIndex] = rowNode.dataOriginal;
  // setRowData(updatedRows);
};

3. 特殊场景补充

如果你的项目用了AG Grid的行事务(Row Transactions)或者批量编辑模式,可以结合gridApi.cancelRowTransactions()来处理,但上面的基础方案已经能覆盖绝大多数常规的单元格编辑场景。

这样设置后,点击每行的撤销按钮,就能一键把该行所有用户修改恢复到初始状态啦~

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

火山引擎 最新活动