ORACLE APEX 20.2 交互式网格列值赋值页项后无法传递到模态页如何解决
Oracle APEX 20.2 Interactive Grid值传递到模态页失败解决方案
核心原因
1. 会话状态未同步
你通过前端JS给页项P8205_ID_MOD_SELECTED赋值仅修改了客户端的页项值,没有将值同步到APEX服务端会话状态。默认打开模态页时APEX读取的是服务端存储的会话状态值,而非客户端最新修改的值,这是该场景下最常见的问题。
2. 模态页调用/配置错误
- 打开模态页的按钮/链接的传参配置有误,源项和目标模态页的接收项绑定错误
- 目标模态页的接收页项开启了会话状态保护,禁止通过URL参数赋值
- 若你需要传递多选IG的ID值,现有JS逻辑每次循环会覆盖之前的ID,最终仅会传递最后一个选中行的ID
对应解决方法
方案1:提交页项到会话状态(适配原有逻辑改动最小)
在触发打开模态页的动作前,新增一步提交操作,将P8205_ID_MOD_SELECTED的最新值同步到服务端:
- 若通过按钮动作打开模态页:直接给按钮新增「提交页项」动作,把
P8205_ID_MOD_SELECTED加入到提交的页项列表中,再执行打开模态页的动作即可。 - 若通过JS触发打开模态页:在你原有赋值逻辑后新增异步提交代码,先同步值再打开模态页:
// 你的原有赋值逻辑 var i, selectedIds = "", model = this.data.model; for ( i = 0; i < this.data.selectedRecords.length; i++ ) { apex.item("P8205_ID_MOD_SELECTED").setValue(model.getValue( this.data.selectedRecords[i], "ID")); } // 新增:提交页项到会话状态 apex.server.process("EMPTY_PROCESS", { pageItems: "#P8205_ID_MOD_SELECTED" }, {async: false}); // 此处后续加你打开模态页的逻辑
上述代码中的EMPTY_PROCESS为当前页新建的空AJAX进程,无需写任何业务逻辑,仅用于触发页项提交动作。
方案2:动态传值不走会话状态
直接在打开模态页的JS逻辑中把值拼接在URL里,不需要提前同步会话状态:
const targetPageId = "你的模态页页码"; const targetReceiveItem = "模态页接收ID的页项名"; const selectedId = apex.item("P8205_ID_MOD_SELECTED").getValue(); const modalUrl = apex.util.applyUrlParameter(apex.page.get_url(targetPageId), targetReceiveItem, selectedId); // 打开模态页 apex.navigation.dialog({ url: modalUrl, title: "模态页标题", modal: true, width: 600 });
配置检查项
- 确认打开模态页的动作中,传递的源项为
P8205_ID_MOD_SELECTED,目标项为模态页的对应接收页项 - 确认模态页接收页项的「会话状态保护」设置为「不受限制」
- 若需传递多选IG的ID,修改原有赋值逻辑为拼接字符串:
const selectedIds = []; const model = this.data.model; for (let i = 0; i < this.data.selectedRecords.length; i++) { selectedIds.push(model.getValue(this.data.selectedRecords[i], "ID")); } apex.item("P8205_ID_MOD_SELECTED").setValue(selectedIds.join(","));
内容的提问来源于stack exchange,提问作者Roberto Cavalcante
相关产品推荐
相关产品推荐

