Grails Webflow com Ajax
-
20-09-2019 - |
Pergunta
Estou tentando fazer a transição para o próximo estado de um webflow usando solicitações AJAX. Mas ele permanece no mesmo estado e retorna o GSP como resposta para esse estado enquanto estou esperando o GSP para o próximo estado.
A seguir, o código do 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")
}
}
}
A seguir, a chamada do Ajax que estou fazendo para a transição do estado:
$.ajax({
type: "POST",
url: "/UN/user/gettingStartedAjax",
success: function(data) {
$("#wizardDiv").html(data);
}
});
Os GSPs para cada estado (Flow1, Flow2, Flow3) contém o fragmento de código AA com o RemoteForm e exigido a seguir e pular os botões de envio para fazer a transição para o próximo estado e, como resultado, atualize o Div "WizardDiv". A seguir, o fragmento GSP para Flow1 State:
<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>
Solução
Além de acompanhar a execução (como o Daxon publicado), você precisará garantir que seus botões sejam nomeados _EventId_Next e _EventId_SKIP. G: O submetbutton é normalmente inteligente o suficiente para fazer isso por você, mas pode não estar dentro de uma forma remota.
Além disso, meu código de fluxo da Web usa a execução do parâmetro, não o FlowExecutionKey - qual versão do Grails você está usando?
Outras dicas
Estou preso no mesmo problema, quase descobri,
O que você precisa fazer é enviar de volta o webflow do Grails "_flowexecutionKey" que acompanha o estado atual,
Tenho certeza que você viu isto, como é o único resultado decente que o Google encontra.
Envio uma solicitação de Ajax para uma ação, que preenche um modelo e a envia de volta com uma tag de entrada,
<input id="flowExecutionKey" name="_flowExecutionKey" value="${request.flowExecutionKey}" size="100"/>
Mas você pode tentar enviar um templo de volta marcado como JSON com o "_flowexecutionKey" junto com os dados que você deseja enviar de volta,
Esses são meus dois centavos
Aqui, uma solução que funciona no Grails 2.5.3 pelo menos para uma única ação. O ID e o nome do botão são automaticamente modificados para incluir "EventID"Como prefixo, mas isso ainda não funcionou para mim, a menos que eu tenha adicionado _event_id manualmente como parâmetro de entrada. No entanto, não tenho certeza de como isso pode funcionar para vários eventos possíveis.
<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>