Oracle APEX:基于薪资列动态设置佣金列只读的代码报错排查
解决Oracle APEX Interactive Grid动态设置COMM列只读问题
原代码的核心错误
- API调用错误:
apex.region("mygrid").call是错误用法,Oracle APEX的Interactive Grid需通过widget().interactiveGrid()调用API方法。 - 逻辑错误:仅获取选中行的薪资值,未遍历每行获取对应行的薪资,导致所有行共用同一个选中行的判断条件。
- 只读设置方式错误:直接修改
commCell.attributes.readOnly无法正确触发IG的编辑状态变更,需使用官方API设置单元格可编辑性。
正确实现代码
方法1:页面加载/批量更新时遍历所有行设置
// 获取Interactive Grid实例 var ig = apex.region("mygrid").widget().interactiveGrid("getViews", "grid"); var model = ig.model; // 遍历每一行记录 model.forEach(function(record) { // 获取当前行的SAL值 var salValue = record.getValue("SAL"); // 定位COMM列 var commColumn = ig.view$.grid("getColumns").find(function(col) { return col.property === "COMM"; // 对应数据库列名或列别名 }); // 根据薪资设置COMM列编辑状态 if (salValue <= 2000) { ig.model.setCellEditable(record, commColumn, false); } else { ig.model.setCellEditable(record, commColumn, true); } }); // 刷新视图使变更生效 ig.view$.grid("refresh");
方法2:编辑SAL列时实时触发状态变更
如果需要用户修改SAL值后立即更新COMM列的只读状态,可绑定IG的编辑事件:
// 绑定Interactive Grid的编辑事件 apex.region("mygrid").widget().interactiveGrid("getViews", "grid").view$.on("interactivegridedit", function(event, ui) { var ig = apex.region("mygrid").widget().interactiveGrid("getViews", "grid"); var record = ui.record; var column = ui.column; // 仅在编辑SAL列时触发 if (column.property === "SAL") { var salValue = record.getValue("SAL"); var commColumn = ig.view$.grid("getColumns").find(function(col) { return col.property === "COMM"; }); if (salValue <= 2000) { ig.model.setCellEditable(record, commColumn, false); } else { ig.model.setCellEditable(record, commColumn, true); } // 刷新当前行视图 ig.view$.grid("refreshRow", record); } });
关键说明
- 确保
mygrid是你的Interactive Grid的Static ID(在IG属性面板中设置)。 - 列的
property对应数据库表的列名或配置时使用的别名。 setCellEditable是官方推荐的修改单元格可编辑性的方法,能正确同步IG的模型与视图状态。
内容的提问来源于stack exchange,提问作者muhammad adil islam
相关产品推荐
相关产品推荐

