2012-03-08 10 views
26

Ho una forma all'interno di una finestra di dialogo che Chiudo facendo clic sul CommandButton con ajax,Come trovare l'indicazione di un errore di convalida (required = "true"), mentre facendo comando ajax

come questo

<h:commandButton value="Add" action="#{myBean.addSomething(false)}" 
    id="add_something_id" > 
    <f:ajax render="@form someTable" execute="@form" 
     onevent="closeAddNewSomethingDialogIfSucceeded"></f:ajax> 
</h:commandButton> 

e qui è il codice js per chiudere la finestra di

function closeAddNewSomethingDialogIfSucceeded(data) { 
     if(data.status === 'success') { 
      $("#dialog_id").dialog("close"); 
     } 
    } 

Nessun problema fino a qui ...

Ora ho cambiato alcuni dei campi del modulo di dialogo in required="true" e ora voglio impedire la chiusura della finestra di dialogo di ho ottenuto errori di convalida ...

Ma l'ajax data.status raggiunge ancora il suo stato success, e non posso capire quale indicazione di fallimento della convalida riesco ad agganciare ...

qualche idea?

Grazie a BalusC risposta che ho fatto la seguente:

in JSF, ha aggiunto:

<h:panelGroup id="global_flag_validation_failed_render"> 
     <h:outputText id="global_flag_validation_failed" value="true" 
      rendered="#{facesContext.validationFailed}"/> 
    </h:panelGroup> 

la F: Ajax è stato modificato in

<f:ajax render="@form someTable global_flag_validation_failed_render" 

e js aggiunto il seguente controllo

if(data.status === 'success') { 
    if($("#global_flag_validation_failed").length === 0){ 
     $("#dialog_id").dialog("close"); 
    } 
} 

risposta

49

Non specifico per required="true", ma è possibile verificare tramite #{facesContext.validationFailed} se la convalida non è riuscita in generale. Se si combina questo con il controllo se il pulsante in questione è premuto da #{not empty param[buttonClientId]}, allora si può mettere insieme l'attributo rendered del <h:outputScript> come segue:

<h:commandButton id="add_something_id" binding="#{add}" value="Add" action="#{myBean.addSomething(false)}"> 
    <f:ajax execute="@form" render="@form someTable" /> 
</h:commandButton> 
<h:outputScript rendered="#{not empty param[add.clientId] and not facesContext.validationFailed}"> 
    $("#dialog_id").dialog("close"); 
</h:outputScript> 

(si noti che è necessario assicurarsi che il script è anche ri-reso da F: Ajax)

Un po 'hacky, ma non è possibile gestirlo nella funzione onevent come l'implementazione JSF standard non fornisce alcuna informazione sullo stato di convalida nella risposta Ajax .

Se si utilizza RichFaces, è possibile utilizzare EL nell'attributo oncomplete del pulsante/collegamento del comando <a4j:xxx>.Sono cioè valutati su una base per-richiesta invece di su una base per-view come in JSF standard ed primefaces:

<a4j:commandButton ... oncomplete="if (#{!facesContext.validationFailed}) $('#dialog_id').dialog('close')" /> 

Oppure, se vi capita di usare primefaces, allora si potrebbe trarre vantaggio dal fatto che primefaces estende la risposta ajax con un ulteriore args.validationFailed attributo che viene iniettato direttamente nella portata JavaScript dell'attributo oncomplete:

<p:commandButton ... oncomplete="if (args &amp;&amp; !args.validationFailed) $('#dialog_id').dialog('close')" /> 

(notare che &amp; è stato usato al posto di &, perché & è un charact speciale in XML/XHTML)

Oppure è possibile utilizzare l'API RequestContext di PrimeFaces nel metodo di azione del bean per eseguire JavaScript a livello di codice nella visualizzazione renderizzata.

RequestContext.getCurrentInstance().execute("$('#dialog_id').dialog('close')"); 

Non sono necessari controlli condizionali poiché il metodo di azione del bean non verrà comunque richiamato quando la convalida non è riuscita.

+0

grazie! alla fine ho usato invocato il # {facesContext.validationFailed} (non ne ero a conoscenza) l'ho usato in una condizione di rendering di semplice outputext ... e più tardi nel codice js ho verificato la presenza di output output usando jquery .length ... – Daniel

+0

Prego. Per una panoramica degli oggetti EL impliciti in JSF, vedere anche [this] (http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#ImplicitELObjects). – BalusC

+1

@BalusC Does facesContext.validationFailed si applica anche agli errori di conversione? È vero se la conversione è fallita? – Bren

2

Penso che dovresti dare un'occhiata a RequestContext di PrimeFaces. Ciò aiuterebbe a far scattare il codice lato client sul lato server.

2

due cose 1) Controllo per un errore nella funzione 'OnEvent'

Sicuramente si dispone di una variabile di segnalazione per il campo obbligatorio?

<h:message id="m-my-field-id" for="my-field-id" errorClass="error-class"/> 

modo da poter controllare l'errore di classe qualcosa di simile

var message = $('#m-my-field-id'); 

if(message.hasClass('error-class'){ 
    //do this 
} 
else{ 
    //do that 
} 

2) Il DOM non è aggiornata in caso di successo

Sì, posso vedere il messaggio sul pagina in Firefox, ma jQuery mi dice che non è lì.

ho trovato che utilizzando il più piccolo possibile timeout è sufficiente a risolvere il problema

setTimeout(
    function(){ 
    setErrorStyle(source.attr('id')); 
    }, 
    1 
); 
Problemi correlati