我正在使用JSF 2开发一个Web应用程序。 我的网络应用程序包含一系列一次一个问题(因此一次只能显示一个问题)并且有多个答案(我使用h:selectManyCheckbox)。
我将问题和可能的答案存储在ArrayList(“gridQuestionListClone”)中,并且用户在HashMap(“allQuestionUserAnswerMap”)中回答(在最后检查它们之前)。 (如果答案要求,我可以更改存储模式。)
当用户完成所有问题的回答时,我想让用户有可能在页面中重新检查所有问题和答案(我想要预先加载的答案)。因此,所有问题及其相应的复选框(每个问题3个)与用户选中的复选框在一个页面中。
所以我使用ui:repeat来完成所有问题和可能的答案,我需要一种机制来检查正确的复选框(用户选中)并让用户有可能改变他/她的答案,当我按下提交按钮(例如)以了解哪些问题对应的复选框。 使草图更清晰的草图:))(也许)。因此,当用户完成回答我想要向他展示的所有单个问题时:
Question 1:
a) answer1 - CHECKED
b) answer2 - UNCHECKED
c) answer3 - CHECKED
------------------------
Question 2:
a) answer1 - UNCHECKED
b) answer2 - UNCHECKED
c) answer3 - CHECKED
------------------------
Question 3:
a) answer1 - CHECKED
b) answer2 - CHECKED
c) answer3 - UNCHECKED
------------------------
.
.
.
Question n:
a) answer1 - CHECKED
b) answer2 - UNCHECKED
c) answer3 - CHECKED
------------------------
SUBMIT button
用户检查他/她的答案并根据需要修改它们并按下提交按钮。 然后我想有一些类型的集合(或者我不太关心的多个集合,之后我可以合并它们),其中包含问题的数量和可能的答案,如“allQuestionUserAnswerMap”中的乞讨或类似的东西
我的琐碎代码(不正确):
<ui:repeat var="p" value="#{gridPopUpBean.gridQuestionListClone}">
<hr />
<h:panelGrid columns="2">
...
<h:panelGroup style="text-align: left">
<h:selectManyCheckbox
value="#{gridPopUpBean.oneQuestionUserAnswerList}"
layout="pageDirection">
<f:selectItem itemValue="a"
itemLabel="#{p.a}" />
<f:selectItem itemValue="b"
itemLabel="#{p.b}" />
<f:selectItem itemValue="c"
itemLabel="#{p.c}" />
</h:selectManyCheckbox>
...
</h:panelGroup>
</h:panelGrid>
</ui:repeat>
有什么想法吗?
答案 0 :(得分:2)
最简单的方法是将复选框组的值绑定到当前迭代的对象,而不是将所有复选框组绑定到同一个父bean属性。
在代码中,只需替换
value="#{gridPopUpBean.oneQuestionUserAnswerList}"
通过
value="#{p.oneQuestionUserAnswerList}"
并相应地对模型进行更改。
或者,您也可以在父bean中按问题ID提供Map
所有答案。这是一个启动示例,它使用了比您更多的自我记录变量名称,因此更容易理解:
<ui:repeat value="#{bean.questions}" var="question">
...
<h:selectManyCheckbox value="#{bean.answers[question.id]}">
<f:selectItems value="#{question.answers}" />
</h:selectManyCheckbox>
...
</ui:repeat>
与例如
private Map<Long, Answer[]> answers = new HashMap<Long, Answer[]>();