2010-01-12 7 views
2

J'essaie de passer à l'état suivant d'un WebFlow en utilisant des requêtes Ajax. Mais il reste dans le même état et renvoie le GSP en réponse à cet état alors que j'attends le GSP pour l'état suivant.Grailles WebFlow avec Ajax

Voici le code de 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") 
      } 
     } 
} 

Ce qui suit est l'appel Ajax que je fais pour la transition de l'État:

$.ajax({ 
      type: "POST", 
      url: "/UN/user/gettingStartedAjax", 
      success: function(data) { 
       $("#wizardDiv").html(data); 
      } 
}); 

Les GSP pour chaque état (flow1, Flow2, flow3) contient Un fragment de code ayant remoteForm & requis et sauter les boutons de soumission pour passer à l'état suivant et mettre à jour la div "wizardDiv". Voici le fragment SPG pour l'état 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> 

Répondre

2

Outre le suivi de l'exécution (comme Daxon affiché), vous devez vous assurer que vos boutons sont appelés _eventId_next et _eventId_s kip. g: submitbutton est normalement assez intelligent pour faire cela pour vous mais il peut ne pas être à l'intérieur d'un remoteForm.

En outre, mon code de flux Web utilise l'exécution du paramètre, pas flowExecutionKey - quelle version de Grails utilisez-vous?

+0

Alors, pourriez-vous me donner un exemple de votre Gsp? L'appel Ajax et la gestion de la réponse, Comme vous devez imprimer le lien dans l'appel Ajax, et pourriez-vous expliquer votre "exécution de paramètre" – Daxon

+0

L'astuce principale est de prendre soin des boutons. Il n'est pas nécessaire d'attraper flowExecutionKey car Grails le fournit déjà en tant que variable d'entrée cachée d'exécution. Mais lors de la publication de l'ajax, avec des données de formulaire sérialisées, il est indispensable d'envoyer le bon nom de bouton, par exemple. si vous cliquez sur Suivant, envoyez _eventId_next dans les données de publication. – kaychaks

+0

@kaychaks - Donc, vous me dites que tout ce que j'ai à faire est d'avoir l'URL correcte avec, par exemple, "_eventid_next" dans l'ajax POST/GET, et c'est ça? Donc je n'ai pas à me soucier de ce que "? Execution = e1s1" j'envoie avec les soumissions et plus de demandes ajax? – Daxon

3

Je suis coincé sur le même problème, presque tout compris,

ce que vous devez faire, est renvoyer les Grails webflow « _flowExecutionKey » que keep piste de l'état actuel,

Je suis sûr que vous avez vu this, comme c'est le seul résultat décent trouvé par Google.

J'envoyer une demande ajax à une action, qui remplit un modèle et le renvoie avec une étiquette d'entrée,

<input id="flowExecutionKey" name="_flowExecutionKey" value="${request.flowExecutionKey}" size="100"/> 

Mais vous pouvez essayer d'envoyer un temple retour marqué vers le haut comme JSON avec le « _flowExecutionKey "ainsi que les données que vous souhaitez renvoyer,

Ce sont mes deux cents

0

Voici une solution qui fonctionne dans les grails 2.5.3 au moins pour une seule action. L'identifiant et le nom du bouton sont automatiquement modifiés pour inclure "eventId" comme préfixe mais cela ne fonctionne toujours pas pour moi sauf si j'ai ajouté _event_id manuellement en tant que paramètre d'entrée. Cependant, je ne suis pas sûr de savoir comment cela peut fonctionner pour plusieurs événements possibles.

<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> 
Questions connexes