Ordine di esecuzione degli eventi quando si preme PrimeFaces p: commandButton

Sto cercando di eseguire un metodo bean JSF2 e mostrare una finestra di dialogo dopo il completamento del metodo al clic di PrimeFaces

.

 

 

Quando faccio clic sul pulsante di comando, il metodo listener dell’azione bean setResultsForSelectedRow viene eseguito correttamente, ma non mostra la finestra di dialogo quando il metodo viene completato. Se rimuovo actionlistener , mostra la finestra di dialogo. Non so cosa stia sbagliando.

Qual è l’ordine di esecuzione degli eventi? È ansible eseguire actionlistener e oncomplete contemporaneamente?

Ha fallito perché hai usato ajax="false" . Questo fa scattare una richiesta sincrona completa che a sua volta causa un ricaricamento di una pagina intera, facendo sì che l’ oncomplete non venga mai oncomplete (si noti che anche tutti gli altri attributi relativi a ajax come process , onstart , onsuccess , onerror e update vengono mai triggersti).

Che ha funzionato quando hai rimosso actionListener è anche imansible. Avrebbe dovuto fallire allo stesso modo. Forse hai rimosso anche ajax="false" senza realmente capire cosa stavi facendo. Rimozione di ajax="false" dovrebbe effettivamente raggiungere il requisito desiderato.


Inoltre è ansible eseguire actionlistener e oncomplete contemporaneamente?

No. Lo script può essere triggersto prima o dopo il listener di azioni. Puoi utilizzare onclick per onclick lo script al momento del clic. È ansible utilizzare onstart per onstart lo script nel momento in cui la richiesta onstart sta per essere inviata. Ma non saranno mai esattamente sparati contemporaneamente. La sequenza è la seguente:

  • L’utente fa clic sul pulsante nel client
  • onclick codice JavaScript onclick viene eseguito
  • JavaScript prepara una richiesta giusta in base al process e all’attuale struttura DOM HTML
  • onstart codice JavaScript viene eseguito
  • JavaScript invia una richiesta Ajax dal client al server
  • JSF recupera una richiesta Ajax
  • JSF elabora il ciclo di vita della richiesta sull’albero del componente JSF in base al process
  • viene eseguito il metodo backing bean di actionListener JSF
  • viene eseguito il metodo di backing bean JSF di action
  • JSF prepara una risposta ajax basata update e l’albero dei componenti JSF corrente
  • JSF invia una risposta ajax dal server al client
  • JavaScript recupera la risposta ajax
    • se lo stato di risposta HTTP è 200, viene eseguito il codice JavaScript in corso
    • altrimenti se lo stato di risposta HTTP è 500, viene eseguito il codice JavaScript onerror
  • JavaScript esegue l’ update base alla risposta ajax e all’albero DOM HTML corrente
  • viene eseguito un codice JavaScript oncomplete

Si noti che l’ update viene eseguito dopo actionListener , quindi se si utilizza onclick o onstart per mostrare la finestra di dialogo, è ansible che venga ancora visualizzato il contenuto precedente anziché il contenuto aggiornato, il che è scadente per l’esperienza dell’utente. Dovresti utilizzare invece oncomplete per mostrare la finestra di dialogo. Si noti inoltre che è meglio utilizzare l’ action anziché actionListener quando si intende eseguire un’azione aziendale.

Guarda anche:

  • Comprensione processo / aggiornamento e JSF f: ajax esegue / rende attributi
  • Differenze tra azione e azioneListener

Adoro ricevere informazioni come BalusC offre qui – ed è così gentile da aiutare TANTE persone con queste BUONE informazioni che considero le sue parole come gospel, ma non ero in grado di usare quell’ordine di eventi per risolvere questo stesso tipo di tempismo problema nel mio progetto. Dato che BalusC ha posto un grande riferimento generale qui che ho persino inserito un segnalibro, ho pensato di donare la mia soluzione per alcuni problemi di temporizzazione avanzati nello stesso posto, poiché risolve anche i problemi di temporizzazione del poster originale. Spero che questo codice aiuti qualcuno:

   Available Media Chosen Media     

La finestra di dialogo è nella parte superiore dell’XHTML all’esterno di questo modulo e ha una sua forma incorporata nella finestra di dialogo insieme a un datatable che contiene ulteriori comandi per lo streaming dei media che devono essere tutti innescati e pronti per essere utilizzati quando la finestra di dialogo è presentata. È ansible utilizzare questa stessa tecnica per fare cose come scaricare documenti personalizzati che devono essere preparati prima di essere trasmessi in streaming al computer dell’utente tramite i pulsanti file Download nella finestra di dialogo.

Come ho detto, questo è un esempio più complicato, ma colpisce tutti i punti più alti del tuo problema e il mio. Quando si fa clic sul pulsante di comando, il risultato è assicurarsi che il backing bean venga aggiornato con i risultati dell’elenco di selezione, quindi comunicare al bean di supporto di preparare i flussi per l’utente in base alle proprie selezioni nell’elenco, quindi aggiornare i controlli in la finestra di dialogo dynamic con un aggiornamento, quindi mostra la finestra di dialogo pronta per consentire all’utente di avviare lo streaming del contenuto.

Il trucco consisteva nell’usare l’ordine degli eventi di BalusC per il comando principaleButton e quindi aggiungere il bit per assicurarsi che fosse eseguito per primo – perché nulla accade correttamente a meno che pickList non abbia aggiornato il backing bean prima (qualcosa che non stava accadendo per me prima che lo aggiungessi). Quindi, sì, il comando CommandButton oscilla perché puoi influenzare i componenti precedenti, in sospeso e correnti, nonché i bean di supporto, ma a volte il tempo di interrelazione di tutti non è facile da gestire.

Buona programmazione!