我遇到了p:tabView
组件的严重问题。我已将dynamic="true"
和cache="false"
设置为tabView。其中一个选项卡包含一些设置为required="true"
的输入组件。
现在每当我更改标签时,表单验证正在进行,FacesMessages将以growl显示。
这是标签:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
template="/WEB-INF/templates/globalTemplate.xhtml">
<ui:define name="title">#{adbBundle['home']}</ui:define>
<ui:define name="content">
<p:growl id="growl" showDetail="true" autoUpdate="true" />
<p:tabView id="adminTabView" dynamic="true" cache="false">
<p:tab title="#{adbBundle['admin.customerTab.title']}"
id="customerTab">
<ui:include src="/WEB-INF/includes/adminCustomer.xhtml" />
</p:tab>
<p:tab title="#{adbBundle['admin.activityTab.title']}"
id="activityTab">
<ui:include src="/WEB-INF/includes/addActivity.xhtml" />
</p:tab>
</p:tabView>
</ui:define>
</ui:composition>
adminCustomer.xhtml包含表单,其中包含:
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:p="http://primefaces.org/ui">
<h:form id="customerForm">
<p:panel id="addCustomerPanel" toggleable="true"
header="#{adbBundle['admin.addCustomerPanel.header.new']}">
<p:panelGrid columns="2" id="addCustomerTable"
styleClass="addCustomerTable">
<f:facet name="header">
<p:outputLabel id="header"
value="#{adbBundle['admin.addCustomerPanel.addCustomerTable.header']}" />
</f:facet>
<p:outputLabel for="customerName"
value="#{adbBundle['admin.addCustomerPanel.addCustomerTable.customerName']}" />
<h:panelGroup layout="block">
<p:inputText id="customerName" styleClass="customerName"
autocomplete="off"
label="#{adbBundle['admin.addCustomerPanel.addCustomerTable.customerName']}"
value="#{adminController.customerDTO.customerName}"
required="true" />
</h:panelGroup>
<p:outputLabel for="customerId"
value="#{adbBundle['admin.addCustomerPanel.addCustomerTable.customerId']}" />
<h:panelGroup layout="block">
<p:inputText id="customerId" autocomplete="off"
label="#{adbBundle['admin.addCustomerPanel.addCustomerTable.customerId']}"
value="#{adminController.customerDTO.customerId}" required="true">
<f:validator validatorId="customerIDValidator" />
</p:inputText>
</h:panelGroup>
<p:outputLabel for="activeStatus"
value="#{adbBundle['admin.addCustomerPanel.addCustomerTable.activeStatus']}" />
<h:panelGroup layout="block">
<p:selectBooleanCheckbox id="activeStatus"
value="#{adminController.customerDTO.active}" />
</h:panelGroup>
<f:facet name="footer">
<p:commandButton value="#{adbBundle['saveButton']}"
actionListener="#{adminController.saveCustomer}"
icon="ui-icon-check"
update=":growl, @form" />
</f:facet>
</p:panelGrid>
</p:panel>
</h:form>
</ui:composition>
我无法找到我做错了什么以及如何解决它。 我使用Primefaces 3.4.2和JSF Mojarra 2.1.7-jbossorg。任何指针都对我很有帮助。
我也在PrimeFaces论坛上提出了这个问题。
答案 0 :(得分:4)
这就是tabView
的工作原理。以下是PrimeFaces跟踪器的相关问题:
如您所见,第一个被标记为WontFix。 第二个是重复的,但最后你会看到另一种解决方法。
如果您仔细阅读该主题,您可能会注意到仍存在一些变通方法。如果您被迫使用tabView
,请尝试其中一个。如果要在不同选项卡中使用输入,也请考虑使用PrimeFaces - Wizard。
答案 1 :(得分:0)
如果我正确理解您的问题,实际上有一个非常简单的解决方法可以防止重复显示消息。
将你的咆哮改为:
<p:growl id="growl" globalOnly="true" autoUpdate="true" showDetail="true" />
如果您想要从辅助bean端添加消息,可以使用以下代码执行此操作:
FacesContext.getCurrentInstance()
.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "title", "details");
如果你想要完全安全,你甚至可以为咆哮指定一个for-attribute,并将其作为addMessage
的第一个参数。