0

我正在 Seam 中制作一个 webapp,但遇到了一个我似乎无法解决的问题。

我有一个 JSF 表单,客户可以在其中通过组合框选择预订类型。根据选择的值,其他表单组件被渲染。

例如:客户选择 Hours 作为预订类型,panelGroup 得到呈现,客户可以在其中选择开始时间和结束时间。但是,如果客户选择“一天中的一部分”作为预订类型,则会呈现一个 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'}"
4

2 回答 2

0

您需要确保rendered在表单提交的后续请求中,负责属性结果的条件也相同。因为当一个组件没有被渲染时,JSF 不会应用请求值它们。

简而言之,后面的属性#{selectedPeriodPart}需要在后续请求中保持一致。有几种解决方案:

  1. 将 bean 放在会话范围内。最简单的解决方案,但对服务器内存和客户端体验不利(更新将反映在同一会话中的多个选项卡/窗口中)。

  2. 通过使用<h:inputHidden>. 不确定这是否适合 Ajax/Richfaces 图片。在这里更好地使用<a4j:keepAlive>

  3. 使用对话范围。Seam为此提供了便利。

于 2010-05-11T13:10:52.777 回答
0

我修好了-.-我发布的代码没有任何问题。因为我无法解决这个问题,所以我在同一个对话的另一个页面上继续。我注意到一些更奇怪的行为:变量的输出不起作用等。

我认为错误出在代码的其他部分,在更正后,解决了整个问题。

谢谢回答家伙!

于 2010-05-11T15:20:22.500 回答