2010-05-11 61 views
0

我在Seam中创建了一个webapp,但遇到了一个我似乎无法修复的问题。表单值在a4j之后没有传递给Seam bean reRender

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

例如:客户选择小时作为预订类型,panelGroup被呈现在客户可以选择开始和结束小时的地方。但是,如果客户选择“部分时间”作为预订类型,则选择一个菜单得到渲染,客户可以在其中选择一天中的一部分(早上,下午,晚上)

表现良好,但组件的值使用渲染的条件不会传递给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> 

注:日历值确实会回传给豆,但这段代码的价值不会(它如果删除所呈现的条件):

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

回答

0

我修正了它 - 没有什么是我贴的代码错了。 因为我无法解决这个问题,我继续在同一个对话的其他页面上。我注意到一些更奇怪的行为:注射变量没有工作等

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

Thx for answering guys!

0

你需要确保负责的rendered属性的结果的条件语句也都在表单提交的后续请求相同。因为当组件未呈现时,JSF将不会应用请求值。

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

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

  2. 传递使用<h:inputHidden>。不知道这是如何适应Ajax/Richfaces图片。这里最好使用<a4j:keepAlive>

  3. 使用对话范围。 Seam为此提供设施。

+0

谢谢回答这个问题=)不解决我的问题=( 做一些事情说清楚:该支持Bean是有状态会话bean(EJB)。与之交谈范围 我试着在包装selectOneMenu value="#{selectedDaypart}"一个a4j:outputPanel并把渲染的条件放在那个组件上,但是这也不起作用。 – Casper 2010-05-11 13:29:41

+0

对不起,只是建议运行一个调试器而已。至少,您现在知道在哪里查找问题的原因以及如何解决问题:确保所讨论组件的“rendered”属性在后续请求中不会评估为“false”。 – BalusC 2010-05-11 13:35:01

相关问题