Domanda

Ho creato forma e voglio mostrare gli articoli esistenti precedenti su una tabella mentre ne sta creando uno nuovo. Vorrei mostrare oggetti corrispondenti mentre il modulo si sta riempiendo. Ma quando provo a filtrare l'elenco senza il completamento del modulo, vengono visualizzati i messaggi di convalida e la tabella non viene aggiornata.

Non so se è possibile, ma cosa voglio fare qualcosa del genere:

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

Sono molto nuovo a JSF.

È stato utile?

Soluzione

Capisco che vuoi filtrare in base al name Campo di inserimento. Il <p:commandButton> invia per impostazione predefinita una richiesta AJAX e ha un process attributo in cui è possibile specificare quali componenti desideri elaborare durante l'invio. Nel tuo caso particolare, dovresti quindi elaborare solo il name campo di input e il pulsante corrente (in modo che la sua azione venga invocata).

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

Il process L'attributo può prendere una raccolta separata di spazio di ID client (relativi) dei componenti, in cui @this si riferisce al componente attuale. È impostazione predefinita in caso di <p:commandButton> a @form (che copre tutti i campi di input della forma corrente e del pulsante premuto), ecco perché sono stati tutti validati nel tuo tentativo iniziale. Nell'esempio sopra, tutti gli altri campi di input non verranno elaborati (e quindi non validati).

Se tuttavia si intende saltare il required convalida per tutto campi ogni volta che viene premuto il pulsante in questione, in modo da poter eventualmente elaborare più campi che non devono necessariamente esserlo tutto compilato, quindi devi fare il required="true" un condizionale invece che controlla se il pulsante è stato premuto o meno. Ad esempio, lascia che valuti true Solo quando è stato premuto il pulsante di salvataggio:

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

In questo modo non verrà validato come required="true" Quando viene premuto un pulsante diverso. Il trucco nell'esempio sopra è che il nome del pulsante premuto (che è essenzialmente l'ID client) è stato inviato come parametro di richiesta e che potresti semplicemente verificare la sua presenza nella mappa dei parametri di richiesta.

Guarda anche:

Altri suggerimenti

L'ho testato con invio non 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" />

Il primo input è richiesto convalidata solo sull'invio del pulsante Save1.

Inoltre alla risposta Balusc (molto utile e completa) voglio aggiungere che quando usi un <h:commandButton /> Convaliderà (richiesto, validazioni personalizzate) tutti i campi nel <h:form /> dove si trova il pulsante di comando, quindi quando è necessario utilizzare più di un pulsante di comando, è possibile considerare che è una buona pratica usare diversi <h:form /> a diverse responsabilità per evitare comportamenti imprevisti nelle azioni di invio dei pulsanti di comando. È ben spiegato in una risposta di Balusc: Multiple H: modulo in una pagina JSF

Se il tuo modulo ha convalide e non si aggiorna il <h:form /> Oppure non mostri messaggi, potresti avere un mal di testa pensando che il <h:commandButton /> Non sta sparando la tua azione, ma probabilmente è un problema di convalida che non è stato mostrato.

Cambia il tuo Filter CommandButton in questo modo per ignorare la convalida:

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

MODIFICARE:

Il post correlato su SO, penso che questo risolverà anche il tuo problema

JSF 2.0: Come saltare la convalida del fagiolo JSR-303?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top