Oracle APEX交互式网格行还原:JS API初始失效问题求助
问题描述
在Oracle APEX的动态动作中尝试使用JavaScript API,根据特定条件还原交互式网格(Interactive Grid)的行更改,执行代码如下:
apex.region("PRODS").call("getActions").invoke("row-revert"); apex.region("PRODS").call("getActions").invoke("selection-revert");
初始执行该代码时无效,但先选中其他行再选中目标行后,在控制台手动运行代码可成功还原行更改。
解决方案
1. 直接定位目标行并还原(不依赖选中状态)
row-revert和selection-revert默认依赖当前选中的行,动态动作执行时可能未正确选中目标行。可以跳过选中逻辑,直接通过模型对象定位并还原目标行:
// 获取交互式网格的模型对象 const igModel = apex.region("PRODS").call("getViews").grid.model; // 遍历行数据,筛选符合条件的目标行(示例:根据ID字段匹配) igModel.forEach(row => { if (row.data.ID === 123) { // 替换为你的业务条件 // 还原该行的所有修改 igModel.revert(row); // 刷新网格视图,同步显示还原结果 apex.region("PRODS").call("refresh"); } });
2. 先选中目标行再执行还原动作
如果必须使用row-revert或selection-revert动作,需确保执行前目标行已被选中:
const igRegion = apex.region("PRODS"); const igGrid = igRegion.call("getViews").grid; const igModel = igGrid.model; // 查找符合条件的目标行 const targetRow = igModel.find(row => row.data.ID === 123); // 替换为你的条件 if (targetRow) { // 清除现有选中状态,避免干扰 igGrid.selection.clear(); // 选中目标行 igGrid.selection.add(targetRow); // 执行还原动作 igRegion.call("getActions").invoke("row-revert"); }
3. 确保动态动作的执行时机正确
动态动作可能因网格未完全初始化或数据未加载完成导致失效,可调整触发时机:
- 将动态动作的执行时机设置为
After Refresh(若依赖网格数据刷新事件) - 或通过延迟执行确保网格就绪:
setTimeout(() => { const igRegion = apex.region("PRODS"); const targetRow = igRegion.call("getViews").grid.model.find(row => row.data.ID === 123); if (targetRow) { igRegion.call("getViews").grid.selection.add(targetRow); igRegion.call("getActions").invoke("row-revert"); } }, 500); // 延迟时间可根据实际场景调整
4. 校验行的修改状态
只有已修改的行才能被还原,可提前判断避免无效操作:
const igModel = apex.region("PRODS").call("getViews").grid.model; const targetRow = igModel.find(row => row.data.ID === 123); if (targetRow && igModel.isChanged(targetRow)) { igModel.revert(targetRow); apex.region("PRODS").call("refresh"); }
内容的提问来源于stack exchange,提问作者Abdullah
相关产品推荐
相关产品推荐

