我正在Seam制作一个网络应用程序,但遇到了一个我似乎无法解决的问题。
我有一个JSF表单,客户可以通过组合框选择预订类型。根据所选值,将呈现其他表单组件。
例如:客户选择小时作为预订类型,会在客户可以选择开始和结束时间的位置呈现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'}"
答案 0 :(得分:0)
您需要确保负责rendered
属性结果的条件在表单提交的后续请求中也是相同的。因为当组件未呈现时,JSF将不会应用请求值。
简而言之,#{selectedPeriodPart}
后面的属性在后续请求中需要相同。有几种解决方案:
将bean放入会话范围。最简单的解决方案,但对服务器内存和客户端体验不利(更新将反映在同一会话中的多个选项卡/窗口中)。
使用<h:inputHidden>
传递它。不确定这是如何适应Ajax / Richfaces图片。在这里更好地使用<a4j:keepAlive>
。
使用会话范围。 Seam为此提供设施。
答案 1 :(得分:0)
我修好了--.-我发布的代码没有错。 因为我无法解决这个问题所以我继续在同一个对话的另一页上。我注意到一些更奇怪的行为:变量的输出不起作用等。
我认为错误在于代码的其他部分,经过纠正后修复了整个问题。
回答家伙的问题!