Pregunta

He creado el formulario y quiero mostrar elementos existentes anteriores en una mesa mientras uno nuevo está creando. Me gustaría mostrar los elementos coincidentes ya que el formulario se está llenando. Pero cuando intento filtrar la lista sin completar el formulario, aparecen los mensajes de validación y la tabla no se actualiza.

No sé si es posible, pero lo que quiero hacer algo como esto:

<h:form id="form">

    <h:outputText value="Name: "/>
    <p:inputText value="#{itemsBean.name}" id="name" required="true"/>
    <br/>
    <h:outputText value="Description: "/>
    <p:inputText value="#{itemsBean.description}" id="description" required="true"/>

    <p:commandButton value="Save" update="form" actionListener="#{itemsBean.save}"/> //validate and save
    <p:commandButton value="Filter" update="form" actionListener="#{itemsBean.updateItemsList}"/> //don't validate, and update the table.

    <p:dataTable id="list" value="#{itemsBean.itemsList}" var="item">     
        <p:column>
            <h:outputText value="#{item.name}"/>
        </p:column>
        <p:column>
            <h:outputText value="#{item.description}"/>
        </p:column>
    </p:dataTable>

</h:form>

Soy muy nuevo en JSF.

¿Fue útil?

Solución

Entiendo que quieres filtrar según el name campo de entrada. los <p:commandButton> envía por defecto una solicitud AJAX y tiene un process Atributo en el que puede especificar qué componentes le gustaría procesar durante el envío. En su caso particular, debe procesar solamente la name campo de entrada y el botón actual (para que se invoque su acción).

<p:commandButton process="@this name" ... />

los process El atributo puede tomar una colección separada de espacio de ID (relativas) del cliente de los componentes, en el que @this se refiere al componente actual. Predeterminado es en caso de <p:commandButton> a @form (que cubre todos los campos de entrada del formulario actual y el botón presionado), por eso todos fueron validados en su intento inicial. En el ejemplo anterior, todos los demás campos de entrada no se procesarán (y por lo tanto tampoco se validan).

Sin embargo, si tiene la intención de omitir el required validación para todos campos siempre que se presione el botón en cuestión, para que eventualmente pueda procesar múltiples campos que no necesariamente necesitan ser todos Llenado, entonces necesitas hacer el required="true" En su lugar, un condicional que verifica si el botón se ha presionado o no. Por ejemplo, déjelo evaluar true Solo cuando se ha presionado el botón Guardar:

<p:inputText ... required="#{not empty param[save.clientId]}" />
...
<p:inputText ... required="#{not empty param[save.clientId]}" />
...
<p:commandButton binding="#{save}" value="Save" ... />

De esta manera no se validará como required="true" Cuando se presiona un botón diferente. El truco en el ejemplo anterior es que el nombre del botón presionado (que es esencialmente la ID del cliente) se envió como parámetro de solicitud y que podría verificar su presencia en el mapa de parámetros de solicitud.

Ver también:

Otros consejos

He probado esto con envíos que no son de AJAX:

<p:inputText ... required="#{not empty param.includeInSave1}" />
...
<p:inputText ... required="true" />
...
<p:commandButton value="Save1" ajax="false">
  <f:param name="includeInSave1" value="true" />
</p:commandButton>

<p:commandButton value="Save2" ajax="false" />

La primera entrada se requiere validada solo en el botón Save1 envío.

Además de la respuesta de Balusc (muy útil y completa) quiero agregar que cuando use un <h:commandButton /> validará (requerido, validaciones personalizadas) todos los campos en el <h:form /> Cuando se encuentra el botón de comando, por lo tanto, cuando necesita usar más de un botón de comando, puede considerar que es una buena práctica usar diferente <h:form /> a diferentes responsabilidades para evitar un comportamiento inesperado en las acciones de envío de los botones de comando. Se explica bien en una respuesta de Balusc: Múltiples h: formulario en una página JSF

Si su formulario tiene validaciones y no actualiza el <h:form /> O no muestra mensajes, puede obtener dolor de cabeza pensando que el <h:commandButton /> no está disparando su acción, pero probablemente es un problema de validación que no se ha mostrado.

Cambie su comando Filter Button de la misma manera para ignorar la validación:

<p:commandButton value="Filter" update="list" actionListener="#{itemsBean.updateItemsList}" process="@this"/>

EDITAR:

La publicación relacionada en So, creo que esto también resolverá su problema.

JSF 2.0: ¿Cómo omitir la validación de frijoles JSR-303?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top