ag-Grid onCellEditingStopped事件无法获取旧值,求解决方案
嗨,我之前也遇到过这个问题!确实onCellEditingStopped本身不会直接返回旧值,不过ag-Grid有几种更优雅的方式来搞定,不用单独维护变量那么麻烦,给你几个实用方案:
方案1:用cellValueChanged事件(最推荐)
这个事件天生就带了oldValue和newValue参数,完美匹配你的需求,而且逻辑更精准——它只会在单元格值真的发生变化时触发,不像onCellEditingStopped不管改没改值都会跑一遍。代码示例:
cellValueChanged: function(event) { console.log('修改前的值:', event.oldValue); console.log('修改后的值:', event.newValue); // 还能拿到对应的行和列信息 console.log('修改的字段:', event.colDef.field); console.log('所在行数据:', event.rowData); }
方案2:在onCellEditingStopped里通过API拿旧值
如果你一定要坚持用onCellEditingStopped,可以通过行节点的原始数据获取旧值(前提是你还没把新值同步到rowData里):
onCellEditingStopped: function(event) { // 从行节点的原始数据中取旧值 const oldValue = event.node.data[event.colDef.field]; const newValue = event.value; console.log('旧值:', oldValue); console.log('新值:', newValue); }
小提示:如果你的grid开了immutableData或者编辑时自动更新了rowData,上面的方法可能失效,这时候可以用gridApi.getOriginalRowNode(event.node.id)获取原始行数据来拿旧值。
方案3:优化你现有的存储方案
要是你还是想沿用自己的思路,建议把旧值存在行节点的自定义属性里,而不是全局变量,这样更清晰也不会冲突:
onCellEditingStarted: function(event) { // 把旧值存在当前行节点的自定义属性中 event.node._editedCellOldValue = event.node.data[event.colDef.field]; }, onCellEditingStopped: function(event) { const oldValue = event.node._editedCellOldValue; const newValue = event.value; console.log('旧值:', oldValue); console.log('新值:', newValue); // 用完记得删掉这个自定义属性,避免内存冗余 delete event.node._editedCellOldValue; }
内容的提问来源于stack exchange,提问作者tnishada
相关产品推荐
相关产品推荐

