Primefaces tabView führt der Validierung von Formularen auf der Registerkarte ändern
Ich habe ein ernstes Problem mit der p:tabView
Komponente. Ich habe dynamic="true"
und cache="false"
dem tabView. Einer der tabs hat einige input-Komponenten, die required="true"
.
Nun, wenn ich mich verändert die Registerkarte jedes mal, wenn der Formular-Validierung ist auftretenden und die FacesMessages angezeigt werden in growl.
Hier ist der tab:
<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>
Den adminCustomer.xhtml enthält der Formular und das ist:
<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>
Ich bin nicht in der Lage zu finden, was ich falsch mache und wie es zu lösen.
Ich bin mit Primefaces 3.4.2 mit Mojarra JSF-2.1.7-jbossorg. Alle Zeiger wäre sehr hilfreich für mich.
Ich habe diese Frage in PrimeFaces forum auch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, wie
tabView
funktioniert. Hier sind die relevanten Themen aus der PrimeFaces-tracker:Wie Sie sehen können, die erste ist gekennzeichnet als WontFix. Die zweite ist eine doppelte, aber am Ende werden Sie sehen, eine andere Problemumgehung.
Wenn Sie Lesen, dass der thread sorgfältig, können Sie feststellen, dass einige workarounds noch vorhanden ist. Einer von Ihnen versuchen, wenn Sie gezwungen sind, zu verwenden
tabView
. Auch erwägen, PrimeFaces - Assistent wenn Sie möchten, verwenden Sie Eingänge in verschiedenen tabs.tabView
wird, überprüfen von Eingaben (wie nach JSF-Spec), aber spätestens seit PF 4.0 gibt esimmediate="true"
zu überspringen, dass die Validierung phase. Außerdem siehe meine Antwort untenWenn ich verstehe dein problem richtig, es ist eigentlich eine Recht einfache Lösung um zu verhindern, dass die doppelte Anzeige von Meldungen.
Ändern Sie Ihr Knurren der folgenden:
In Fall, dass Sie möchten, fügen Sie Nachrichten aus backing-bean-Seite, die Sie tun können, dass mit dem folgenden code:
Und wenn Sie möchten ganz sicher sein, können Sie sogar angeben, ein for-Attribut, um das Knurren und nehme das als ersten parameter
addMessage
.