APEX:向模态页面传值、设空值及提交异常问题求助
解决APEX模态页无法获取源页面项值的问题
你遇到的核心问题其实很典型:打开模态页P20时,P10隐藏项的最新值还没同步到APEX的会话状态里——直接跳转的话,APEX不会自动把当前页面的项值提交到后台会话;但全页提交又会刷新页面,刚打开的模态窗直接就被冲没了。
下面给你分两种按钮场景,提供具体的解决步骤,不用全页提交也能让P20拿到正确的值:
针对EDIT按钮的调整
你原来的EDIT按钮是直接重定向,现在改成用动态动作来处理:
- 把EDIT按钮的行为改成「由动态动作定义」
- 给这个按钮创建动态动作,触发条件选「按钮点击」
- 动态动作里按顺序加这几个步骤:
- 第一步:保留你原来的设置P10隐藏项的动作(确保是从交互式网格选中行正确取值)
- 第二步:用AJAX异步提交隐藏项到会话状态
添加「执行JavaScript代码」动作,代码如下(替换成你的实际项名):apex.server.process( 'SYNC_P10_HIDDEN_ITEM', // 自定义的应用进程名称 { x01: $v('P10_YOUR_HIDDEN_ITEM') // 你的P10隐藏项ID }, { success: function() { // 提交成功后再打开模态页 apex.navigation.dialog({ url: 'f?p=&APP_ID.:20:&SESSION.::NO::P20_RECORD_ID:' + $v('P10_YOUR_HIDDEN_ITEM'), title: '编辑记录', height: 500, width: 700, modal: true }); } } ); - 第三步:创建对应的AJAX回调应用进程
进入应用的「共享组件」→「应用进程」→「创建」:- 名称设为
SYNC_P10_HIDDEN_ITEM,进程点选「AJAX 回调」 - 进程代码写:
:P10_YOUR_HIDDEN_ITEM := apex_application.g_x01;
- 名称设为
针对NEW按钮的调整
NEW按钮已经是动态动作定义,只需要修改现有步骤:
- 保留原来的「设置P10隐藏项为Null」的动作
- 把原来直接打开模态页的步骤,换成带AJAX提交的逻辑:
添加「执行JavaScript代码」动作,代码如下:
(这里可以复用上面创建的apex.server.process( 'SYNC_P10_HIDDEN_ITEM', { x01: null }, { success: function() { // 打开模态页,明确传递空值 apex.navigation.dialog({ url: 'f?p=&APP_ID.:20:&SESSION.::NO::P20_RECORD_ID:', title: '新建记录', height: 500, width: 700, modal: true }); } } );SYNC_P10_HIDDEN_ITEM应用进程,它会自动把Null赋值给P10的隐藏项)
优化P20的预渲染逻辑
建议在P20里创建一个专门的页面项(比如P20_RECORD_ID),用来接收传递过来的值,然后预渲染时直接用这个项查询:
IF :P20_RECORD_ID IS NOT NULL THEN -- 根据ID查询并填充P20的各项 SELECT column1, column2 INTO :P20_COLUMN1, :P20_COLUMN2 FROM your_table WHERE id = :P20_RECORD_ID; ELSE -- 新建状态下清空所有项 :P20_COLUMN1 := NULL; :P20_COLUMN2 := NULL; END IF;
为什么这个方法能解决问题?
apex.server.process是APEX官方的AJAX工具,它会在后台异步把值提交到会话状态,完全不会刷新当前页面。等提交完成后再打开模态页,P20的预渲染动作就能拿到最新的正确值,既不会闪退,也能实现你的需求。
内容的提问来源于stack exchange,提问作者Scott Hillier
相关产品推荐
相关产品推荐

