You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

APEX:向模态页面传值、设空值及提交异常问题求助

解决APEX模态页无法获取源页面项值的问题

你遇到的核心问题其实很典型:打开模态页P20时,P10隐藏项的最新值还没同步到APEX的会话状态里——直接跳转的话,APEX不会自动把当前页面的项值提交到后台会话;但全页提交又会刷新页面,刚打开的模态窗直接就被冲没了。

下面给你分两种按钮场景,提供具体的解决步骤,不用全页提交也能让P20拿到正确的值:

针对EDIT按钮的调整

你原来的EDIT按钮是直接重定向,现在改成用动态动作来处理:

  1. 把EDIT按钮的行为改成「由动态动作定义」
  2. 给这个按钮创建动态动作,触发条件选「按钮点击」
  3. 动态动作里按顺序加这几个步骤:
    • 第一步:保留你原来的设置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按钮已经是动态动作定义,只需要修改现有步骤:

  1. 保留原来的「设置P10隐藏项为Null」的动作
  2. 把原来直接打开模态页的步骤,换成带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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:32:47