Коллекция selectManyCheckbox внутри ui:repeat знает, к какому элементу повторителя она принадлежит.

Я разрабатываю веб-приложение с использованием JSF 2. Мое веб-приложение, помимо прочего, содержит ряд вопросов, задаваемых по одному (поэтому один вопрос виден одновременно) и имеет несколько ответов (я использую 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>

Любые идеи?


person CyberGriZzly    schedule 27.02.2013    source источник
comment
Спасибо BalusC! Я сделал это самым простым способом (1-й). Большое спасибо за Вашу помощь!   -  person CyberGriZzly    schedule 05.03.2013


Ответы (1)


Простейшим способом было бы просто привязать значение группы флажков к текущему итерируемому объекту, а не все группы флажков к одному и тому же свойству родительского компонента.

В коде просто замените

value="#{gridPopUpBean.oneQuestionUserAnswerList}"

by

value="#{p.oneQuestionUserAnswerList}"

и внести соответствующие изменения в модель.

Кроме того, вы также можете предоставить 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[]>();
person BalusC    schedule 27.02.2013