通过 JavaScript Oracle APEX 打开模式对话框

Posted

技术标签:

【中文标题】通过 JavaScript Oracle APEX 打开模式对话框【英文标题】:Open modal dialog through JavaScript Oracle APEX 【发布时间】:2017-12-14 19:11:24 【问题描述】:

我正在尝试通过 javascript 重定向 URL 打开模式对话框页面。

我的代码是这样的:

$('#Subnet tr').each(function (i, row)
        var $row = $(row);
        var $hostname =  $row.find('[headers=Hostname]');
        if($hostname.text() == '-')
           var url = "f?p="+$v('pFlowId')+":113:"+$v('pInstance')+"::::P113_SUBNET_ID:"+$row.find('[headers=ID]').text();
           $hostname.html("<a href='"+url+"'><span class='fa fa-plus-square-o'></span></a>");
           console.log($row.find('[headers=ID]').text()+ ' / '+$row.find('[headers=Address]').text());
        

    );

但我收到一条错误消息:

谁能告诉我我做错了什么?

或者也许是另一种重定向到模态对话框页面的方式?

【问题讨论】:

请勿发布代码、数据、错误消息等的图片 - 将文本复制或输入到问题中。 How to Ask 【参考方案1】:

您应该使用页面进程来计算 URL。 这可能是一个 Ajax 进程:

DECLARE
    l_url varchar2(2000);
    l_app number := v('APP_ID');
    l_session number := v('APP_SESSION');

    l_item_name VARCHAR2(2000) := 'P27_XYZ';
BEGIN
    l_url := APEX_UTIL.PREPARE_URL(
        p_url => 'f?p=' || l_app || ':'||apex_application.g_x01||':'||l_session||'::NO::'||l_item_name||':'||apex_application.g_x02,
        p_checksum_type => 'SESSION');
    htp.p(l_url);
END;

用这个 Javascript 调用它:

apex.server.process(
    'PREPARE_URL',                           
    
        x01: 27, 
        x02: 'myvalue'
    , 
    
        success: function (pData)
                   
            console.log(pData);
        ,
        dataType: "text"                     
    
);

你会得到一个 javascript 代码,你需要调用它。它会计算出正确的校验和,您可以完美地打开对话框。

【讨论】:

【参考方案2】:

这也是一个可行的解决方案(略有不同)。

请注意调用 apex.navigation.redirect 以实际打开对话框页面。

function editAgenda (p_agenda_id) 
l_url = 'f?p=#APP_ID#:72:#SESSION#::NO:RP,72:P72_AGENDA_ID:#AGENDA_ID#';

l_url = l_url.replace('#APP_ID#',    $v('pFlowId'));
l_url = l_url.replace('#SESSION#',   $v('pInstance'));
l_url = l_url.replace('#AGENDA_ID#', p_agenda_id);

// execute PL/SQL API apex_uti.prepare_url to generate a valid Session State Protection checksum
apex.server.process(    
    'editAgendaDA',
    x01: l_url,
    success: function (pData)            
            console.log(pData);
            // Call Modal Dialog Page
            apex.navigation.redirect(pData);
        ,
        dataType: "text"                     
    
  );

-- 处理editAgendaDA(在Ajax回调中)

declare
    l_url varchar2(2000);   
    v_result varchar2(4000);
begin
    v_result := apex_util.prepare_url(apex_application.g_x01);
    htp.prn(v_result);
end;

【讨论】:

【参考方案3】:

在某些情况下,使用“重定向到此应用程序中的页面”操作、静态 ID(例如,button1)和自定义属性(例如,style="display:none")创建一个按钮会很有帮助:

然后,在您的 JavaScript 代码中,调用 $('#button1').click();

【讨论】:

您说“在某些情况下,创建一个按钮会有所帮助……”您能否详细说明这会有所帮助的情况? 例如,当您想在报告中有一列带有指向另一个模式窗口的链接时 - 在每一行中。除此之外,您的意思是 APEX 中的“低代码”?

以上是关于通过 JavaScript Oracle APEX 打开模式对话框的主要内容,如果未能解决你的问题,请参考以下文章

Oracle Apex:PL/SQL 块中的 Javascript 代码

如何在动态操作中单击按钮时调用Oracle APEX中的javascript函数?

JavaScript 调用`setTimeout` 在 Oracle Apex 中不起作用

如何在 Oracle Apex 中使用静态 ID 定位图表系列?

Oracle APEX:如何更改交互式网格中开关列的值(使用动态操作 - JavaScript)?

Oracle ApeX (PL/SQL) - 从 JavaScript 变量中创建绑定变量