噗。起初我认为这会更容易一些,但经过一段时间后,我发现无线电组非常适合磨牙。 (这是在顶点 4.1 顺便说一句)
通常我会回答说使用apex_item 将是动态创建项目的方法。然而,放射性基团的反应是扭曲的。
如果你会使用例如:
for r in(select level l, 'question '||level q, 'Y' a
from dual
connect by level < 6)
loop
htp.p('<div>'||r.q);
htp.p(
APEX_ITEM.TEXT(
p_idx => 1,
p_value => r.a,
p_size => 3,
p_maxlength => 1)
);
htp.p('</div>');
end loop;
输出将是:
<div>question 1
<input type="text" name="f01" size="3" maxlength="1" value="Y" />
</div>
<div>question 2
<input type="text" name="f01" size="3" maxlength="1" value="Y" />
</div>
<div>question 3
<input type="text" name="f01" size="3" maxlength="1" value="Y" />
</div>
<div>question 4
<input type="text" name="f01" size="3" maxlength="1" value="Y" />
</div>
<div>question 5
<input type="text" name="f01" size="3" maxlength="1" value="Y" />
</div>
太棒了!生成 5 个字段,可使用 apex_application.g_F01 数组访问,其中字段 1 为 apex_application.g_f01(1)。
然而,放射性基团的反应不同。 APEX_ITEM.RADIOGROUP 所做的实际上并不是创建单选组,而是创建单选按钮。然后该组将成为 f01 数组。
哇!我不喜欢那样! F## 数组一开始只从 1 到 50,因此如果您要生成一些项目,这并不理想。
此外,您的逻辑被搞砸了:突然间,您不必再循环遍历数组了,而是遍历数组。
例如,如果您将apex_item.text 替换为apex_item.radiogroup,输出将是这样的
<div>question 1
<input type="radio" name="f01" value="Y" />Yes?
</div>
<div>question 2
<input type="radio" name="f01" value="Y" />Yes?
</div>
<div>question 3
<input type="radio" name="f01" value="Y" />Yes?
</div>
<div>question 4
<input type="radio" name="f01" value="Y" />Yes?
</div>
<div>question 5
<input
它按照你的要求做了:它创建了一个由项目组成的无线电组。如果您点击第 4 题的按钮并且之前已标记第 1 题,则该标记将从第 1 题中删除并设置为 4。
但是它可以工作。当您提交并循环 F01 数组时,它将传递值:
--this after submit process
for i in 1..apex_application.g_f01.count
loop
apex_debug_message.log_message('array F01: item '||i||': '||apex_application.g_f01(i));
end loop;
--results in this debug message:
--array F01: item 1: Y
好的,那你有什么选择呢?不要使用这个。它不是动态的!你不能遍历 50 个数组,除非你在每个数组上写 50 个循环......
那么 APEX 实际上是如何工作的呢?查看页面项目无线电组的输出代码时,输出如下:
<input type="hidden" name="p_arg_names" value="50795996117686343389" />
<fieldset id="P3_RGROUP_PAGE_ITEM" tabindex="-1" class="radio_group">
<input type="radio" id="P3_RGROUP_PAGE_ITEM_0" name="p_t01" value="Yes" checked="checked" />
<label for="P3_RGROUP_PAGE_ITEM_0">Y</label><br />
<input type="radio" id="P3_RGROUP_PAGE_ITEM_1" name="p_t01" value="No" />
<label for="P3_RGROUP_PAGE_ITEM_1">N</label></fieldset>
看到隐藏的物品了吗?我假设 apex 将所选值放入该隐藏项中,因此您可以轻松引用 radiogroup 的所选值。
这可能是解决此问题的最佳方法。生成您的单选组和按钮,并使用 javascript 将所选值放入隐藏项中。您可以使用apex_item.hidden 创建隐藏项,谢天谢地,之后您可以在数组中轻松引用它。如果你使用p_idx => 1,所有隐藏的项目将被存储到数组g_f01。
您只需要在您的无线电组容器中搭载这个隐藏的项目。然后将 onchange 事件绑定到您的单选按钮。
例如,看看这个jsfiddle。这会将所选值保留在隐藏项目中,该项目将在提交时发布。
抱歉这篇文章太长了,我没想到它会变得如此复杂。希望有人过来告诉我们一个简单的方法:)