2010-05-11 62 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