0

私は JSF 2 を使用して Web アプリを開発しています。とりわけ、私の Web アプリには、一度に 1 つずつ配置された一連の質問が含まれており (一度に 1 つの質問が表示されます)、複数の回答があります (h:selectManyCheckbox を使用します)。

質問と可能な回答を ArrayList ("gridQuestionListClone") に保存し、ユーザーの回答を (最後にチェックする前に) HashMap ("allQuestionUserAnswerMap") に保存します。(答えが必要な場合は、ストレージのモダリティを変更できます)。

ユーザーがすべての質問に回答し終わったら、ユーザーがページ内のすべての質問と回答を再確認できるようにしたいと考えています (回答をプリロードしたい)。したがって、すべての質問とそれに対応するチェックボックス (質問ごとに 3 つ) と、ユーザーが 1 つのページでチェックボックスをオンにしました。

したがって、私は 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

最も簡単な方法は、すべてのチェックボックスグループを1つの同じ親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 に答える