2013-03-13 48 views
0

使用JSF 1.2和3.3 RichFaces的,我有這樣的形式:重新呈現豐富:一個tabpanel而不會丟失數據

<h:form> 
    <rich:tabPanel switchType="client" id="tabPnl"> 
     <rich:tab label="MAIN_TAB"> 
      <h:outputText value="#{msg.date}"/> 
      <rich:calendar value="#{MyBean.date}"> 
       <f:validator validatorId="CalendarValidator" /> 
      </rich:calendar> 
      <h:message for="DataInici" errorClass="error" /> 

      <h:outputText value="#{msg.selector}"/> 
      <h:selectOneMenu id="select_val" value="#{MyBean.selectedItem}"> 
       <f:selectItem itemLabel="#{msg.select_value}" itemValue="-1" /> 
       <f:selectItems value="#{MyBean.listOfItems}" /> 
       <f:validator validatorId="NumSelValidator" /> 
       <a4j:support event="onchange" reRender="tabPnl" ajaxSingle="true" /> 
      </h:selectOneMenu> 
      <h:message for="select_val" errorClass="error" /> 
     </rich:tab> 

     <rich:tab label="SUBTAB1" id="subtab1" rendered="#{MyBean.selectedItem == 1}"> 
      // form components such as inputText and/or SelectOneMenu. 
     </rich:tab> 

     <rich:tab label="SUBTAB2" id="subtab2" rendered="#{MyBean.selectedItem == 2}"> 
      // Other form components such as inputText and/or SelectOneMenu. 
     </rich:tab> 
    </rich:tabPanel> 

    <h:commandButton value="#{msg.insert}" action="#{MyBean.insertData}"> 
</h:form> 

在開始時,SUBTAB1和SUBTAB2不會呈現爲默認值MyBean.selectedItem是-1。

首先,用戶在<rich:calendar>組件中挑選一個日期,然後在<h:selectOneMenu>中選擇一個值。之後,期望的行爲(我想實現的)是在不丟失已經引入的數據的情況下對tabPanel進行reRender。因此,我預計標籤SUBTAB1SUBTAB2將根據在<h:selectOneMenu>中選擇的值而呈現。

我得到了什麼:tabPanel被重新渲染,合適的SUBTAB被渲染,但第一個選項卡中引入的數據丟失。

如何渲染這些選項卡而不會丟失已經引入的數據?我試着重新調整特定的標籤,但不讓它們呈現(我認爲它隻影響到它們的內容)。

預先感謝您。

注意:所涉及的所有bean都是會話作用域。

+0

兩天前我提交了一個類似的問題。我刪除了它,因爲我認爲這個問題是由於設計錯誤造成的,但事實並非如此。對不起,刪除了這個問題。 – jmrodrigg 2013-03-13 16:29:12

+0

看起來您有一個請求作用域管理bean來執行任務。您可以將其更改爲會話作用域或將其留在請求作用域,並將'@ KeepAlive'標記註釋分配給託管的Bean類:'@KeepAlive public class MyBean {...}' – 2013-03-13 21:44:39

回答

1

問題是輸入值不在服務器上處理。 從a4j:support中刪除ajaxSingle="true",因此在selectOneMenu值更改時處理整個表單。您可以使用process屬性來限制提交的區域(以防您不想處理整個表單)。

ajaxSingle

限制JSF樹處理(解碼,轉換,驗證和模型 更新)僅發送請求的組件。布爾。默認 值爲「false」。

+0

感謝您的迴應,它已澄清了如何我的表單實際上工作。從'a4j:support'中刪除'ajaxSingle = true'已經解決了這個問題,但是現在這些字段無法驗證它們是否沒有被正確填充,所以'rich:tabPanel'不會被重新編譯。是否有可能跳過驗證,但保留值?我只是希望在用戶按下「插入」按鈕時執行它們。 – jmrodrigg 2013-03-14 09:37:29

+0

@jimrodrigg模型中無法設置無效值。如果selectOneMenu上的某些內容需要更改,則只能處理必須有效執行操作的字段。在你的情況下,我相信a4j:支持可以得到過程=「calendarId,selectOneMenuId」。 – Andrey 2013-03-14 17:20:23

+0

事實上,整個表單需要處理=)非常感謝您的澄清。 – jmrodrigg 2013-03-14 18:48:47

相關問題