0

我正在使用 JSF 2 开发一个 Web 应用程序。我的 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>

有任何想法吗?

4

1 回答 1

2

最简单的方法是将复选框组的值绑定到当前迭代的对象,而不是将所有复选框组绑定到一个相同的父 bean 属性。

在代码中,只需替换

value="#{gridPopUpBean.oneQuestionUserAnswerList}"

经过

value="#{p.oneQuestionUserAnswerList}"

并相应地更改模型。

或者,您也可以Map通过父 bean 中的问题 ID 提供所有答案。这是一个启动示例,它使用了比您拥有的更多的自记录变量名称,以便更好地理解:

<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[]>();
于 2013-02-27T21:12:16.103 回答