我目前正在使用oracle APEX 4.1,并且在动态创建无线电组时存在问题。
我有一个简单的要求(!)来显示表格中的问题列表,并在每个问题旁边显示是/否放射组按钮。问题清单可能会有所不同,因此不是一成不变的。
为此,我决定创建一个plsql匿名块,代码示例如下:
For c1 IN (select * from question)
LOOP
v_row:=v_row+1;
v_rowName:='F'||v_row;
v_radioYes:='<input type="radio" name='||v_rowName||' value="yes" />Yes';
v_radioNo:='<input type="radio" name='||v_rowName||' value="no" />No';
v_radio:=v_radioYes||' '||v_radioNo;
htp.p('<tr><td>'||v_row||'. '||c1.Question_text||'</td><td>'||v_type||'</tr>');
END LOOP;
因此,问题正在显示,并且每个问题旁边也会显示无线电组。
我的问题是,在提交时,我需要找出用户为每个问题选择的选项并保存到数据库。很容易,但我不能参考每个问题的radiobuttons来找出用户检查的内容。 理想情况下,这些单选按钮应该是使用APEX工具创建的,但我无法动态地在循环中执行此操作。有没有办法引用动态创建的这些无线电组?我采取了错误的做法吗?
答案 0 :(得分:1)
我最近遇到了几乎同样的问题。我找到所选选项的解决方案是将p_onchange
参数添加到APEX_ITEM.RADIOGROUP
函数调用(请参阅Apex 4.1 API参考)。你可以在那里放置任何JavaScript代码。我编写了一个简单的函数来将选定的值分配给隐藏的输入字段。
这是js函数:
function put_selected_value(sel_value) {
$x('P66_SELECTED_VALUE').value=sel_value;
}
和RADIOGROUP
apex_item.RADIOGROUP(10, wrk_id, null, null, null, null,
'javascript:put_selected_value(this.value);')
答案 1 :(得分:0)
Pfew。起初我觉得这会有点容易,但是经过一段时间的捣乱后,我发现放射线组很像牙齿。 (这是在顺便说一下4.1 btw)
通常我会回答说使用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究竟是如何运作的呢?查看页面项目radiogroup的输出代码时,这是输出:
<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将所选值放在该隐藏项中,因此您可以轻松地引用所选的无线电组的值。
这可能是您解决此问题的最佳方法。生成您的radiogroups和按钮,并使用javascript将所选值放入隐藏项目中。您可以使用apex_item.hidden
创建隐藏项目,幸运的是,您可以随后在数组中轻松引用它。如果您使用p_idx => 1
,则所有隐藏的项目都将存储到数组g_f01
。
您只需要在您的radiogroup容器中搭载这个隐藏的项目。然后将onchange事件绑定到您的radiobuttons。 例如,看看这个jsfiddle。这会将所选值保留在隐藏项目中,该项目将在提交时发布。
对于这篇长篇文章感到抱歉,我觉得它不会那么复杂。希望有人出现并向我们展示一种简单的方法:)