2013-02-20 41 views
3

我正在使用PrimeFaces 3.3和Mojarra 2.17。primefaces tabView跳過選項卡更改時的表單驗證

我有一個網頁,其中包含p:tabView。第二個選項卡包含一個文本框和required="true"。當我從第二個選項卡導航到第一個選項卡時,它將驗證文本框爲空,並顯示一條錯誤消息(我有一個PhaseListener類在全局p:messages中顯示錯誤)。如何跳過此驗證?

我不能找到任何解決方案:

,我不希望使用PrimeFaces p:wizard

我tabView.xhtml:

<p:tabView id="tabView" dynamic="true" cache="false" activeIndex="0" > 
     <p:ajax event="tabChange" listener="#{test.onTabChange}"/> 
     <p:tab id="tab1" title="Tab1"> 
     <ui:include src="#{test.tab1}"></ui:include> 
     </p:tab> 
     <p:tab id="tab2" title="Tab2"> 
     <ui:include src="#{test.tab2}"></ui:include> 
     </p:tab> 
</p:tabView> 

在我的Java類:

public void onTabChange(TabChangeEvent event) {    
    this.setTab1("tab1.xhtml"); 
    this.setTab2("tab2.xhtml"); 
} 

我tab1.xhtml:

<h:form id="form1">  
    <p:messages globalOnly="true" /> 
    tab1 page 
    <br/> 
</h:form> 

我tab2.xhtml:

<h:form id="form2"> 
    <p:messages globalOnly="true" /> 
    <p> 
     tab2 page 
    </p> 
    <p:inputText id="txt1" required="true" /> 
    <p:message for="txt1" display="text" /> 
    <p:commandButton value="Submit" update="@form" /> 
</h:form> 

我的PhaseListener類:

public class MyPhaseListener implements PhaseListener { 
    @Override 
    public void afterPhase(PhaseEvent e) { 
     if (e.getPhaseId() == PhaseId.PROCESS_VALIDATIONS) { 
      if (FacesContext.getCurrentInstance().getMessageList().size() > 0) { 
       String number = String.valueOf(FacesContext.getCurrentInstance().getMessageList().size()); 
       String errorMsg = "there are " + number + " errors."; 
       FacesContext.getCurrentInstance().addMessage(
         null, 
         new FacesMessage(FacesMessage.SEVERITY_ERROR, errorMsg, 
           errorMsg)); 
      } 
     } 
    } 
} 
+0

根據您目前的設置,你沒有其他的選擇。你可以做的一件事是使用EL表達式 – kolossus 2013-02-20 12:58:10

+0

@kolossus使'required'屬性有條件,你能解釋一下嗎?我目前的設置仍然需要什麼選項?以及如何使用EL表達式來設置所需的屬性條件? – 2013-02-21 01:11:51

回答

3

我加入的代碼解決我的問題:
FacesContext.getCurrentInstance()的renderResponse()。
下backign豆TabChangeEvent方法..

如:

public void onTabChange(TabChangeEvent event) {    
    this.setTab1("tab1.xhtml"); 
    this.setTab2("tab2.xhtml"); 
    FacesContext.getCurrentInstance().renderResponse(); 
} 
0

添加immediate="true"在你的Ajax事件標記屬性。這將防止您的字段得到驗證,而只是你的聽衆會叫:

<p:ajax event="tabChange" listener="#{test.onTabChange}" immediate="true"/> 
+0

我已經試過了,並且錯誤仍然存​​在:( – 2013-02-20 09:55:18

+0

錯誤信息是從以前的某個提交中停留還是顯示在何時更改選項卡? – partlov 2013-02-20 09:57:22

+0

我確認它來自選項卡更改。 – 2013-02-20 10:07:18

相關問題