Primefaces tabView выполняет проверку формы при смене вкладки

У меня серьезная проблема с компонентом p:tabView. Я установил dynamic="true" и cache="false" в tabView. На одной из вкладок есть некоторые компоненты ввода, которые установлены required="true".

Теперь, когда я каждый раз меняю вкладку, происходит проверка формы, и сообщения FacesMessages отображаются в рычании.

Вот вкладка:

<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.


person Tapas Bose    schedule 23.12.2012    source источник


Ответы (2)


Вот как работает tabView. Вот актуальные проблемы трекера PrimeFaces:

Как видите, первый помечен как WontFix. Второй дубликат, но в конце вы увидите другой обходной путь.

Если вы внимательно прочитаете эту ветку, вы можете заметить, что некоторые обходные пути все еще существуют. Попробуйте один из них, если вы вынуждены использовать tabView. Также рассмотрите возможность использования PrimeFaces - Wizard, если вы хотите использовать входные данные на разных вкладках.

person Akos K    schedule 26.12.2012
comment
Мне почему-то кажется, что вы неправильно поняли вопрос, но я не уверен. Да, это задокументированное поведение, что tabView будет проверять входные данные (в соответствии с JSF-Spec), но, по крайней мере, начиная с PF 4.0, есть immediate="true", чтобы пропустить эту фазу проверки. Дополнительно см. мой ответ ниже - person Vogel612; 14.08.2014

Если я правильно понимаю вашу проблему, на самом деле существует довольно простой обходной путь для предотвращения дублирования отображения сообщений.

Измените рычание на следующее:

<p:growl id="growl" globalOnly="true" autoUpdate="true" showDetail="true" />

Если вы хотите добавить сообщения со стороны поддерживающего компонента, вы можете сделать это с помощью следующего кода:

FacesContext.getCurrentInstance()
   .addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO, "title", "details");

И если вы хотите быть в полной безопасности, вы даже можете указать атрибут for для рычания и использовать его в качестве первого параметра для addMessage.

person Vogel612    schedule 14.08.2014