primefaces tabView跳过选项卡更改时的表单验证
我正在使用PrimeFaces 3.3和Mojarra 2.17。primefaces tabView跳过选项卡更改时的表单验证
我有一个网页,其中包含p:tabView
。第二个选项卡包含一个文本框和required="true"
。当我从第二个选项卡导航到第一个选项卡时,它将验证文本框为空,并显示一条错误消息(我有一个PhaseListener
类在全局p:messages
中显示错误)。如何跳过此验证?
我不能找到任何解决方案:
- http://code.google.com/p/primefaces/issues/detail?id=3423
- http://code.google.com/p/primefaces/issues/detail?id=4143
,我不希望使用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));
}
}
}
}
我加入的代码解决我的问题:
FacesContext.getCurrentInstance()的renderResponse()。
下backign豆TabChangeEvent方法..
如:
public void onTabChange(TabChangeEvent event) {
this.setTab1("tab1.xhtml");
this.setTab2("tab2.xhtml");
FacesContext.getCurrentInstance().renderResponse();
}
添加immediate="true"
在你的Ajax事件标记属性。这将防止您的字段得到验证,而只是你的听众会叫:
<p:ajax event="tabChange" listener="#{test.onTabChange}" immediate="true"/>
我已经试过了,并且错误仍然存在:( – 2013-02-20 09:55:18
错误信息是从以前的某个提交中停留还是显示在何时更改选项卡? – partlov 2013-02-20 09:57:22
我确认它来自选项卡更改。 – 2013-02-20 10:07:18
根据您目前的设置,你没有其他的选择。你可以做的一件事是使用EL表达式 – kolossus 2013-02-20 12:58:10
@kolossus使'required'属性有条件,你能解释一下吗?我目前的设置仍然需要什么选项?以及如何使用EL表达式来设置所需的属性条件? – 2013-02-21 01:11:51