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

通过代码修改ag-grid数据时能否使用Undo/Redo功能?

AG-Grid 代码触发数据变更后的 Undo/Redo 实现方案

默认情况下,AG-Grid 的 Undo/Redo 功能只追踪用户手动触发的单元格编辑操作,通过代码直接调用 rowNode.setDataValue 修改数据时,这个操作不会被自动加入撤销栈,所以调用 undoCellEditing() 无效——因为该方法仅针对用户手动编辑的会话。

要让代码修改的数据能被 Undo/Redo 追踪,你需要使用 AG-Grid 的事务(Transaction)API来执行数据变更,事务操作会被自动记录到撤销栈中,之后就能正常调用撤销/重做方法。

示例代码(纯 JS 版本)

1. 初始化 Grid 并开启 Undo/Redo

const gridOptions = {
  columnDefs: [
    { field: 'id', editable: false },
    { field: 'name', editable: true },
    { field: 'age', editable: true }
  ],
  rowData: [
    { id: 1, name: 'Alice', age: 25 },
    { id: 2, name: 'Bob', age: 30 }
  ],
  // 开启单元格编辑的 Undo/Redo
  undoRedoCellEditing: true,
  // 可选:设置撤销栈的最大容量
  undoRedoCellEditingLimit: 20
};

// 初始化 Grid
new agGrid.Grid(document.getElementById('myGrid'), gridOptions);

2. 通过事务 API 修改数据(可被 Undo/Redo 追踪)

// 定义修改函数
function updateRowViaTransaction(rowId, field, newValue) {
  const rowNode = gridOptions.api.getRowNode(rowId);
  if (!rowNode) return;

  // 使用 applyTransaction 执行数据变更
  gridOptions.api.applyTransaction({
    update: [
      { ...rowNode.data, [field]: newValue }
    ]
  });
}

// 调用修改:把 Bob 的年龄改成 35
updateRowViaTransaction(2, 'age', 35);

3. 执行撤销/重做操作

// 撤销刚才的修改(Bob 的年龄变回 30)
gridOptions.api.undoCellEditing();

// 重做刚才的修改(Bob 的年龄变回 35)
gridOptions.api.redoCellEditing();

补充说明

如果因为某些场景必须使用 rowNode.setDataValue,你可以手动创建编辑会话并记录操作到撤销栈,但这种方式比较繁琐,容易出现边缘问题,仅作参考:

function updateRowWithManualUndo(rowNode, field, newValue) {
  const oldValue = rowNode.data[field];
  
  // 手动触发编辑开始事件
  gridOptions.api.startEditingCell({
    rowIndex: rowNode.rowIndex,
    colKey: field
  });
  
  // 修改数据
  rowNode.setDataValue(field, newValue);
  
  // 手动触发编辑结束事件,让 Grid 记录这个操作到撤销栈
  gridOptions.api.stopEditing();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 19:17:09