2010-01-12 99 views
2

我正在尝试使用Ajax请求转换到WebFlow的下一个状态。但是,当我期待GSP进入下一个状态时,它保持在同一状态并返回GSP作为该状态的响应。带Ajax的Grails WebFlow

以下是一个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") 
      } 
     } 
} 

以下是Ajax调用我正在为国家过渡:

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

每个状态的GSP(流1,流2,FLOW3)包含接下来需要具有remoteForm &的代码片段,并跳过提交按钮以转换到下一个状态,并因此更新“wizardDiv”div。以下是流1状态GSP片段:

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

回答

2

以及保持执行的曲目(如达信发布的),你需要确保你的按钮命名为_eventId_next和_eventId_s基普。 g:submitbutton通常足够聪明,可以为你做到这一点,但它可能不在remoteForm中。

此外,我的Web流代码使用参数执行,而不是flowExecutionKey - 您正在使用哪个版本的Grails?

+0

那么,你能给我一个你的Gsp的例子吗? Ajax调用和处理响应,因为您必须打印Ajax调用中的链接,并且可以进一步解释您的“参数执行” – Daxon 2010-01-13 13:11:35

+0

主要技巧是照顾按钮。没有必要捕获flowExecutionKey,因为Grails已经将其作为执行隐藏输入变量提供。但是,在发布ajax和序列化表单数据时,必须发送正确的按钮名称,例如如果点击下一步然后在发布数据中发送_eventId_next。 – kaychaks 2010-01-13 16:00:15

+0

@kaychaks - 所以你对我说,我所要做的就是使用正确的URL。 ajax POST/GET中的“_eventid_next”,那就是它? 因此,我不必关心我通过提交和更多的ajax请求发送了什么“?execution = e1s1”? – Daxon 2010-01-13 21:35:33

3

我卡在了同样的问题,几乎想通了,

你需要做的,是发回的Grails的Webflow“_flowExecutionKey”说保持 跟踪当前状态,

我相信你已经看过this,因为它是Google发现的唯一体面的结果。

我发送一个Ajax请求的动作,其填充模板,并将其发送回 与输入标签,

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

但你可以尝试发回标记像JSON寺庙与“_flowExecutionKey “随着这是我的两分钱

要发回的数据,

0

这里的解决方案在grails 2.5.3中起作用,至少对于一个单独的操作。该按钮的ID和名称会自动修改为包含“eventId”作为前缀,但这仍然不适用于我,除非手动添加_event_id作为输入参数。不过,我不确定这可以用于多个可能的事件。

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