Oracle APEX 21.2.8:限制交互式网格仅勾选一个复选框
Oracle APEX 21.2.8 交互式网格实现单选复选框方案
针对你遇到的动态动作触发失效问题,这里提供两种基于APEX原生机制的可行方案,确保动态渲染的行也能正常响应单选逻辑:
方案一:动态动作+IG模型操作
- 给复选框列设置静态ID(比如
single_select),在列属性的「标识」选项卡中配置。 - 创建动态动作:
- 触发条件选「JavaScript表达式」,输入:
$("input[type='checkbox'][id*='single_select']").is(":checked") - 触发事件选「Change」,作用域必须选「动态」(否则分页或新加载的行无法绑定事件)。
- True操作添加「执行JavaScript代码」,替换
YOUR_IG_STATIC_ID为你的交互式网格静态ID后输入:const currentCheckbox = $(this.triggeringElement); const currentRow = currentCheckbox.closest(".a-GV-row"); const igInstance = apex.region("YOUR_IG_STATIC_ID").widget(); const currentRecordId = currentRow.data("id"); // 遍历所有记录,取消非当前行的勾选状态 igInstance.model.forEach(record => { if (record[igInstance.model.idAttribute] !== currentRecordId) { record.set("single_select", false); } }); // 刷新视图同步UI显示 igInstance.view.refresh();
- 触发条件选「JavaScript表达式」,输入:
方案二:列初始化代码绑定事件(更简洁)
直接在复选框列属性中配置,无需额外创建动态动作:
- 编辑复选框列,切换到「高级」选项卡。
- 在「JavaScript初始化代码」中输入:
这段代码会自动给每一行的复选框绑定change事件,实时处理单选逻辑。function(options) { // 设置默认未勾选 options.defaultValue = false; // 每一行渲染完成后绑定事件 options.afterCreate = function(rowNode, value, record, opts) { const checkbox = rowNode.querySelector("input[type='checkbox']"); checkbox.addEventListener("change", function() { if (!this.checked) return; const ig = apex.region(opts.regionId).widget(); // 遍历所有记录取消其他行勾选 ig.model.forEach(rec => { if (rec[ig.model.idAttribute] !== record[ig.model.idAttribute]) { rec.set(opts.column.name, false); } }); ig.view.refresh(); }); }; return options; }
关键注意点
- 务必确保交互式网格和复选框列的静态ID配置正确,否则无法定位元素或获取IG实例。
- 若IG开启分页,切换页面后之前页的勾选状态会保留;如果需要全局唯一选中,可以额外添加一个页项存储当前选中的记录ID,切换页时清空其他页的勾选状态。
内容的提问来源于stack exchange,提问作者JozeStrozer
相关产品推荐
相关产品推荐

