Oracle APEX - 如果从自定义按钮打开子模态对话框页面,如何刷新父页面 IG

Oracle APEX - How to refresh parent page IG if child modal dialog page opened from custom button

我的页面上有一个 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。如何从父页面捕获模态对话框关闭?

模态对话框应使用 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 Expression = document) 上添加监听 Dialog Closed 事件的动态操作。请注意,如果通过关闭或取消按钮关闭对话框,则不会触发该事件。