Значение формы не передано в объект Seam после reRender a4j

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

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

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

Рендеринг выполняется хорошо, но значения компонентов с отрисованным условным выражением не передаются компоненту. Они остаются нулевыми значениями.

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

<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>

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

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

person Casper    schedule 11.05.2010    source источник


Ответы (2)


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

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

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

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

  3. Используйте область разговора. Seam предлагает для этого средства.

person BalusC    schedule 11.05.2010
comment
Спасибо за ответ на вопрос =) Это не решает мою проблему = (Чтобы прояснить некоторые моменты: поддерживающий компонент - это компонент сеанса с отслеживанием состояния (ejb) с областью разговора. Я пробовал обернуть ‹code› selectOneMenu value = # {selectedDaypart } ‹/Code› в ‹code› a4j: outputPanel ‹/code› и поместил рендеринг в условное обозначение для этого компонента, однако это тоже не сработало. - person Casper; 11.05.2010
comment
Извините, ничем не могу больше, чем просто предложение запустить отладчик. По крайней мере, теперь вы знаете, где искать причину проблемы и как ее исправить: убедитесь, что атрибут rendered рассматриваемого компонента не оценивается как false в последующем запросе. - person BalusC; 11.05.2010

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

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

Спасибо, что ответили, ребята!

person Casper    schedule 11.05.2010