Come trovare l’indicazione di un errore di convalida (richiesto = “true”) mentre si esegue il comando ajax

Ho un modulo in una finestra di dialogo che chiudo facendo clic su commandbutton con ajax,

come questo

   

ed ecco il codice js per chiudere la finestra di dialogo

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

Nessun problema fino a qui …

Ora ho modificato alcuni dei campi del modulo di dialogo in required="true" e ora voglio impedire la chiusura della finestra di dialogo di avere errori di validazione …

Ma l’ajax data.status raggiunge ancora il suo stato di success , e non riesco a capire quale indicazione di errore di convalida riesco ad agganciare …

qualche idea?

Grazie alla risposta BalusC ho fatto quanto segue:

in JSF, aggiunto:

     

la f: ajax è stata cambiata in

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

e in js ha aggiunto il seguente controllo

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

Non specificatamente per required="true" , ma è ansible verificare con #{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]} , è ansible inserirlo nell’attributo di rendered di come segue:

     $("#dialog_id").dialog("close");  

(nota che è necessario accertarsi che lo script venga nuovamente sottoposto a rendering f: ajax)

Un po ‘hacky, ma non è ansible gestirlo nella funzione onevent quanto l’implementazione JSF standard non fornisce alcuna informazione sullo stato di convalida nella risposta ajax.

Se ti capita di utilizzare RichFaces, puoi semplicemente utilizzare EL nell’attributo oncomplete del pulsante / collegamento . Esse sono valutate su una base per richiesta invece che su una base per visualizzazione come in JSF standard e PrimeFaces:

  

Oppure, se usi PrimeFaces, puoi sfruttare il fatto che PrimeFaces estende la risposta ajax con un ulteriore attributo args.validationFailed che viene iniettato direttamente nello scope JavaScript dell’attributo oncomplete :

  

(nota che & è stato usato al posto di & , perché & è un carattere speciale in XML / XHTML)

Oppure puoi utilizzare l’API RequestContext 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à invocato comunque quando la convalida non ha avuto esito positivo.

Due cose 1) Verifica di un errore nella funzione ‘onevent’

Sicuramente hai un tag messaggio per il campo obbligatorio?

  

Quindi puoi controllare la class di errore come qualcosa

 var message = $('#m-my-field-id'); if(message.hasClass('error-class'){ //do this } else{ //do that } 

2) Il DOM non è aggiornato in caso di successo

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

Ho scoperto che usare il minor timeout ansible è sufficiente per risolvere questo problema

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

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