【问题标题】:Oracle APEX - How to refresh parent page IG if child modal dialog page opened from custom buttonOracle APEX - 如果从自定义按钮打开子模式对话框页面,如何刷新父页面 IG
【发布时间】:2020-03-10 09:04:17
【问题描述】:

我的页面上有一个带有自定义工具栏按钮的 IG,该按钮可打开模态对话框页面。由于模态对话框的打开方式,我无法使用本机Dialog Close 捕获其关闭。

我在 IG 中用来打开 Modla Dialog 的 javascript 是:

            apex.server.process(    
                'GenerateURL',
                {x01: l_url},
                {success: function (pData) {           
                    console.log(pData);
                    // Call Modal Dialog Page
                    apex.navigation.redirect(pData);
                },
                dataType: "text"     
           });

问题是模式对话框关闭后我需要刷新我的 IG。如何从父页面捕获模态对话框关闭?

【问题讨论】:

    标签: oracle-apex oracle-apex-19.1


    【解决方案1】:

    模态对话框应使用apex.navigation.dialog 打开。当一个模式页面调用apex_util.prepare_url 时,它会生成正确的JavaScript 代码,该代码会考虑到目标页面的设置。

    有一个选项,p_plain_url,可用于仅获取 URL,但不要在 GenerateURL 中启用它,因为其余部分很重要。另一个参数 p_triggering_element 允许您为动态操作指定元素(这不是 apex_page.get_url 的选项,其工作方式类似)。

    假设GenerateURL 看起来像这样(注意我将文档作为触发元素传递):

    declare
    
      l_url varchar2(512);
    
    begin
    
      l_url := apex_util.prepare_url(
        p_url                => 'f?p=' || :APP_ID || ':51:' || :APP_SESSION || ':::::P51_ID:' || apex_application.g_x01,
        p_triggering_element => 'document'
      );
    
      apex_json.open_object();
      apex_json.write('url', l_url);
      apex_json.close_object();
    
    end;
    

    那么JavaScript代码可以修改成这样:

    apex.server.process(    
        'GenerateURL',
        {x01: idForURL},
        {success: function (pData) {           
          var funcBody = pData.url.replace(/^"javascript:/, '').replace(/\"$/,'');
    
          new Function(funcBody).call(window);
        }
    });
    

    请注意,JavaScript 将 ID 传递给生成 URL 的进程,而不是整个 URL。这使得该过程的使用受到一定限制,这有助于防止用户滥用它。您甚至可以添加一个检查来验证用户是否能够查看传入的 ID 值。

    有了这个,您可以添加一个动态操作来监听document(JavaScript 表达式 = 文档)上的 Dialog Closed 事件。请注意,如果对话框通过关闭或取消按钮关闭,则不会触发该事件。

    【讨论】:

    • 谢谢。 idForURL 是什么?我放什么?
    • 谢谢!!我之前错过了triggeringElement!添加它使一切变得不同。尽管我仍然不确定要传递什么 idForUrl 即使它没有被使用
    • 抱歉,我包含 idForURL 只是为了表明您可能会在 URL 中传递会话状态。通常,URL 从报表转到表单,其中表单页面的主键是通过 URL 语法设置的。这只是向您展示了如何做到这一点,但您的用例可能不需要它。
    • 所以我应该完全排除这部分` {x01: idForURL},` 吗?还是只是将其设置为空字符串?
    • 您的 URL 是否设置会话状态(URL 中的位置 7 和 8)?如果没有,请随意将其完全删除。
    猜你喜欢
    • 1970-01-01
    • 2020-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-29
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多