Значение формы не передается в Seam bean после aRj reRender - PullRequest
0 голосов
/ 11 мая 2010

Я делаю веб-приложение в Seam, но столкнулся с проблемой, которую не могу исправить.

У меня есть форма JSF, в которой клиент может выбрать тип бронирования через комбинированный список. На основе выбранного значения отображаются другие компоненты формы.

Например: клиент выбирает Часы в качестве типа бронирования, группа Panel отображается, где клиент может выбрать часы начала и окончания. Но если клиент выберет «часть дня» в качестве типа бронирования, то будет отображаться selectOneMenu, где клиент может выбрать часть дня (утро, день, вечер)

Хорошо воспроизводится, но значения компонентов с обработанным условным выражением не будут переданы в bean-компонент. Они остаются нулевыми значениями.

Это код, о котором я говорю:

<s:div id="spot"
       rendered="#{selectedProduct.productType.name eq 'Flex Spot'}">

    <h:panelGrid columns="2">
        <h:outputText value="Reservation Type" />
        <h:selectOneMenu value="#{selectedPeriodPart}">
            <s:selectItems
                value="#{productManager.getAvailableDayPartsSpot()}"
                var="daypart"
                label="#{daypart.label}"></s:selectItems>
            <s:convertEnum />

            <a4j:support ajaxSingle="true"
                         event="onchange"
                         action="#"
                         reRender="spot">
            </a4j:support>
        </h:selectOneMenu>

        <h:outputText id="date_spot" value="Date" />

        <a4j:outputPanel id="calendar_spot" layout="block">
            <rich:calendar value="#{reservation.reservationPeriod.startDate}"
                           locale="en" cellWidth="24px"
                           cellHeight="22px"
                           style="width:200px" />
        </a4j:outputPanel>

        <h:outputText rendered="#{selectedPeriodPart eq 'DAY_PART'}"
                      value="Daypart" />

        <h:selectOneMenu value="#{selectedDaypart}"
                         rendered="#{selectedPeriodPart eq 'DAY_PART'}">
            <f:selectItem id="si_morning" itemLabel="Morning (6:00 - 12:00)"
                          itemValue="morning" />
            <f:selectItem id="si_afternoon"
                          itemLabel="Afternoon (12:00 - 18:00)" itemValue="afternoon" />
            <f:selectItem id="si_evening" itemLabel="Evening (18:00 - 00:00)"
                          itemValue="evening" />
        </h:selectOneMenu>

        <h:outputText rendered="#{selectedPeriodPart eq 'HOURS'}"
                      value="Hours" />

        <h:panelGroup id="hours_spot"
                      rendered="#{selectedPeriodPart eq 'HOURS'}">
            <ui:include src="/includes/reservation/select_hours.xhtml" />
        </h:panelGroup>
    </h:panelGrid>
</s:div>

Примечание. Значение календаря передается обратно в bean-компонент, но значение этого фрагмента кода не выполняется (это происходит, если вы удаляете условное выражение):

selectOneMenu value="#{selectedDaypart}" rendered="#{selectedPeriodPart eq 'DAY_PART'}"

Ответы [ 2 ]

0 голосов
/ 11 мая 2010

Я исправил это. Ничего не было не так с кодом, который я отправил. Поскольку я не смог решить эту проблему, я продолжил на другой странице в том же разговоре. Я заметил еще более странное поведение: вывод переменной не работал и т. Д.

Я полагал, что ошибка была в какой-то другой части кода, которая после исправления исправила всю проблему.

Спасибо за ответы, ребята!

0 голосов
/ 11 мая 2010

Необходимо убедиться, что условные выражения, ответственные за результат атрибута rendered, также совпадают в последующем запросе отправки формы. Потому что, когда компонент не отображается, JSF не будет применять значения запроса к ним.

В двух словах, свойство позади #{selectedPeriodPart} должно быть таким же в последующем запросе. Есть несколько решений:

  1. Поместите бин в область действия сеанса. Самое простое решение, но плохо для памяти сервера и работы с клиентом (обновления будут отображаться на нескольких вкладках / окнах в одном сеансе).

  2. Пропустите его, используя <h:inputHidden>. Не уверен, однако, как это вписывается в картину Ajax / Richfaces. Лучше использовать <a4j:keepAlive> здесь.

  3. Используйте область разговора. Шов предлагает возможности для этого.

...