一个界面内selectManyCheckbox集:重复知道中继的元素,它属于哪个(Collectio

2019-07-20 16:24发布

我正在开发使用JSF 2.除其他事项外我的web应用程序包含了一系列的问题摆一次一个web应用程序(所以一个问题是,在一个时间可见),并有多个答案(我用H:selectManyCheckbox)。

我存储在一个ArrayList中(“gridQuestionListClone”)的问题和可能的答案和解答用户在一个HashMap(“allQuestionUserAnswerMap”)(末尾检查之前)。 (我可以改变存储方式,如果答案需要它)。

当用户完成回答所有我想给用户重新检查所有的问题和答案的可能性问题(我想预装的答案)中的页面。 因此,所有与用户的问题和其对应的复选框(3在每个问题)在一个页面中选中的复选框。

所以我使用的UI:重复要经过所有的问题和可能的答案,我需要一个机制来检查正确的复选框(用户选中),让用户改变他/她的回答的可能性,当我按下提交按钮(例如)知道哪个复选框哪些问题相对应。 草图,使事情更清晰:))(也许)。 因此,当用户完成回答所有我想告诉他单的问题:

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>

有任何想法吗?

Answer 1:

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

在代码中,只需更换

value="#{gridPopUpBean.oneQuestionUserAnswerList}"

通过

value="#{p.oneQuestionUserAnswerList}"

并做出相应的模型的变化。

另外,您也可以提供一个Map的所有答案的问号ID在父bean。 下面是它使用比你有,所以它的更好的理解更多的自我记录变量名开球例如:

<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[]>();


文章来源: Collection of selectManyCheckbox inside a ui:repeat knows which element of the repeater it belongs to