在 Oracle ApEx 4.1 中并假设通过使用 jQuery,我如何根据下拉列表动态创建文本项字段,其中询问用户需要多少文本项?
一个基本示例是,如果用户从下拉列表中选择 3,则将向用户显示 3 个单独的文本字段。
然后我的另一个问题是,我将如何将这些字段中的数据保存到数据库中?
除了上述之外,根据存储在数据库中的数据,我还需要基于一些模板生成富文本格式 - 这如何在 Oracle ApEx 中完成。
在 Oracle ApEx 4.1 中并假设通过使用 jQuery,我如何根据下拉列表动态创建文本项字段,其中询问用户需要多少文本项?
一个基本示例是,如果用户从下拉列表中选择 3,则将向用户显示 3 个单独的文本字段。
然后我的另一个问题是,我将如何将这些字段中的数据保存到数据库中?
除了上述之外,根据存储在数据库中的数据,我还需要基于一些模板生成富文本格式 - 这如何在 Oracle ApEx 中完成。
您可以通过多种方式解决此问题。
但是,如果您想要可以引用的实际页面项目:P20_SOME_ITEM
并希望即时生成这些项目:那将行不通。
如果您知道存在上限并且希望使用实际的页面项目,那么您可以通过在页面项目上设置条件来实现此目的。例如,选择值从 1 到 6 的列表。在更改时提交页面。P20_ITEM1
始终显示第一项。第二项P20_ITEM2
有一个条件,类型为SQL Expression
:
:P20_AMOUNT>1
然后,您可以将相同的条件应用于其他项目::P20_AMOUNT>2
, >3
,...
另一种方法仍然是使用文本输入,但不被绑定变量引用。您可以应用与表格形式相同的逻辑:使用项目数组。你仍然可以通过以下几种方式来解决这个问题:
(1)例如:创建一个实际的手动表格形式经典报告,来源:
select apex_item.text(1, null) some_item
from dual
connect by level <= :P20_AMOUNT
使该列成为标准报告列。您不会有 addrow 按钮,但由于第一行将始终存在,您可以克隆该行。
function addRows(){
var lAmount = $("#P20_AMOUNT").val(),
lTbody = $("#report_tabform tbody.uReportBody table tbody"),
lInitRow = $("tr:first", lTbody);
for(var i=1;i<lAmount;i++){
lTbody.append(lInitRow.clone());
};
};
这是主题 23 (Crimson) 的选择器,因此您可能需要对其进行调整。它将克隆第一行并将其附加 x 次。例如,您可以在按钮中调用此函数。
(2)创建一个 plsql 区域 当然你也可以通过一个 PLSQL 区域输出所需的 HTML。
FOR i IN 1..:P20_AMOUNT
LOOP
htp.p('<input type="text" name="f01" />');
END LOOP;
这也需要在金额选择更改后提交页面。
(3)或者使用javascript创建一切:
//with empty region as basis
//pNode: node which will hold the generated table
//pName: name of the item array (f01, f02,...)
//pAmount: amount of items to be generated
function generateItemArray(pNode, pName, pAmount){
var lTable = $('<table></table>'),
lRow = $('<tr></tr>'),
lCell = $('<td></td>'),
lInput = $('<input name="'+pName+'" type="text" />'),
lnRow, lnInput;
//ln vars: will hold cloned items
//cloning is necessary because the same instance can not be
//put in multiple places
for(var i=1;i<=pAmount;i++){
lnRow = lRow.clone(); //new row
lnRow.append(lCell.clone().text("Text for item "+i)); //first cell: label
lnRow.append(lCell.clone().append(lInput.clone())); //second cell: input item
lTable.append(lnRow); //append the row to the table
};
pNode.html(lTable); //replace node contents with new table
// or use append - but you may want to clear the previous content
// Best use would be to provide a container which you know will only
// contain the generated items.
};
当金额发生变化时,这不需要提交。您可以通过绑定到选择列表的 onchange 事件来动态执行此操作。
--->
在这 3 种情况下,您可以通过关联的数组访问提交的值。例如,考虑这个 After Submit 过程:
for i in 1..apex_application.g_f01.count
loop
apex_debug_message.log_message('item value: '||apex_application.g_f01(i));
end loop;
当您在调试模式下运行页面时,这会将值发送到调试输出。