Grails WebFlow con l'Ajax
-
20-09-2019 - |
Domanda
Sto cercando di passare al successivo stato di un WebFlow utilizzando richieste Ajax. Ma rimane nello stesso stato e restituisce l'SPG come risposta per quello stato, mentre mi aspetto lo SPG per il prossimo stato.
In seguito è il codice WebFlow:
def gettingStartedAjaxFlow = {
flow1 {
on("next") {
println "flow1"
}.to("flow2")
on("skip").to("flow2")
}
flow2 {
on("next") {
println "flow2"
}.to("flow3")
on("skip").to("flow3")
}
flow3 {
on("next"){
println "flow3"
}.to("finish")
on("skip").to("finish")
finish {
redirect(action:"index")
}
}
}
In seguito è l'Ajax chiamata sto facendo per la transizione di stato:
$.ajax({
type: "POST",
url: "/UN/user/gettingStartedAjax",
success: function(data) {
$("#wizardDiv").html(data);
}
});
I GSP per ogni stato (flow1, flow2, FLOW3) contiene un frammento di un codice dotato remoteForm & richiesto Avanti e passare presentare pulsanti per la transizione allo stato successivo e di conseguenza aggiornare il div "wizardDiv". Di seguito è riportato il frammento GSP per lo stato flow1:
<g:formRemote name="flow1Form" url="[controller:'user', action:'gettingStartedAjax']" update="wizardDiv">
<p>You are in flow 1</p>
<g:submitButton name="next" value="Next Flow" />
<g:submitButton name="skip" value="Skip Flow" />
</g:formRemote>
Soluzione
Oltre a tenere traccia dell'esecuzione (come pubblicato Daxon), è necessario assicurarsi che i pulsanti sono chiamati _eventId_next e _eventId_skip. g:. submitButton normalmente è abbastanza intelligente per fare questo per voi, ma potrebbe non essere all'interno di una remoteForm
Inoltre, il mio codice flusso web utilizza l'esecuzione parametro, non flowExecutionKey -? Quale versione di Grails stai usando
Altri suggerimenti
Sono bloccato sullo stesso problema, quasi capito,
quello che devi fare, è inviare di nuovo i Grails webflow "_flowExecutionKey" che mantiene traccia dello stato corrente,
Sono sicuro che hai visto questo , come il suo l'unico risultato decente trova Google.
mando una richiesta AJAX per un'azione, che popola un modello e lo rimanda indietro con un tag input,
<input id="flowExecutionKey" name="_flowExecutionKey" value="${request.flowExecutionKey}" size="100"/>
Ma si potrebbe provare a inviare un tempio posteriore contrassegnato come JSON con il "_flowExecutionKey" insieme con i dati che si desidera inviare di nuovo,
Ecco i miei due centesimi
Ecco una soluzione che funziona in Grails 2.5.3, almeno per una singola azione. L'id e il nome del tasto vengono modificate automaticamente per includere " eventId " come prefisso, ma questo ancora non ha funzionato per me, se non ho aggiunto _event_id manualmente come parametro di input. Tuttavia, non sono sicuro di come questo possa funzionare per più eventi possibili.
<g:formRemote name="flow1Form" url="[controller:'user', action:'gettingStartedAjax']" update="wizardDiv">
<input type="hidden" id="execution" name="execution" value="${request.flowExecutionKey}"/>
<input type="hidden" id="_eventId" name="_eventId" value="next"/>
<fieldset class="form">
</fieldset>
<fieldset class="buttons">
<g:submitButton name="next" value="Next flow"/>
</fieldset>
</g:formRemote>