it-swarm.it

Primefaces onclick e onsuccess differenze

Ho la seguente situazione:

dopo aver fatto clic su un pulsante, viene eseguita una logica aziendale e, una volta eseguita, una nuova scheda con un report deve essere visibile.

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.businesslogic}" 
                 onstart="ajaxDialog.show();"
                 oncomplete="ajaxDialog.hide();"
                 onsuccess="window.open('./report.jsp', '_newtab');" />

Questo non funziona :(

Se la logica di business dura solo alcuni millisecondi, i seguenti lavori:

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.fastbusinesslogic}" 
                 onclick="window.open('./report.jsp', '_newtab');" />

l'onclick apre una nuova scheda, anche cose come onstart ma non funziona con onsuccess o oncomplete. Perché? E c'è una soluzione per la logica di business che dura qualche secondo?

16
Ziagl

Ho notato che onsuccess per il pulsante di comando PrimeFaces non funziona. L'oncomplete tuttavia funziona e ha bisogno anche se c'è un errore, come nel mio caso mostra una finestra di dialogo riuscita anche se c'è un errore nella mia logica aziendale. Ho provato a usare onsuccess ma non funziona. Potresti provare come completato come di seguito:

<p:commandButton value="this button" update="growlMain"
                 actionListener="#{myBean.businesslogic}" 
                 onstart="ajaxDialog.show();"
                 oncomplete="ajaxDialog.hide(); window.open('./report.jsp', '_newtab');"/>
7
Gunjan Kalra

onclick viene chiamato prima che venga creata la richiesta Ajax (lato client puro) mentre oncomplete e onsuccess vengono eseguite dopo che il server ha risposto alla richiesta Ajax. Quindi, se hai bisogno di eseguire alcune logiche di business prima di mostrare una finestra di dialogo, ad esempio, vuoi andare con oncomplete. Questo è quello che uso sempre.

Puoi anche condizionare il tuo javascript in incompleto da eseguire solo se non ci sono errori di validazione. Intuitivamente penso che il successo si comporterà in questo modo e verrà eseguito solo quando non ci sono errori di validazione, ma non è così che va. Non so davvero la differenza tra loro. Presumo che ci sia un modo per contrassegnare success = false nei backing bean, ma non ho potuto trovarlo nella documentazione.

Se vuoi verificare la convalida nel tuo attributo oncomplete, ecco come faresti:

oncomplete="if (!args.validationFailed){someDialog.hide()}"

In questo caso, chiudere la finestra solo se i campi sono validati correttamente. È possibile in realtà immettere parametri dal bean di supporto e utilizzarli in javascript dopo che la richiesta è stata notificata. Nel tuo backing bean puoi fare qualcosa del genere:

RequestContext.getCurrentInstance().addCallbackParam("showDialog", false);

E puoi accedere al parametro come questo nel tuo attributo incompleto:

oncomplete="if (args &amp;&amp; args.showDialog){someDialog.show()}else{ alert('the bean didnt let me open the dialog')}"

Comunque, spero che aiuti.

33
Andre

Puoi vedere la differenza qui:

Primefaces e ajax onsuccess event

oppure con onsuccess puoi fare qualcosa prima del DOM a pieno carico

1
makkasi