Grails WebFlow与Ajax

时间:2010-01-12 17:33:14

标签: ajax grails spring-webflow

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

以下是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(flow1,flow2,flow3)包含一个具有remoteForm&的代码片段。需要下一个并跳过提交按钮以转换到下一个状态,结果更新“wizardDiv”div。以下是flow1状态的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>

3 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,几乎把它搞清楚了,

您需要做的是,发送回保留的Grails webflow“_flowExecutionKey” 跟踪当前状态,

我确定你已经看过this,因为它是Google发现的唯一不错的结果。

我向一个动作发送ajax请求,该动作填充模板并将其发回 带有输入标签,

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

但您可以尝试使用“_flowExecutionKey”以及要发回的数据发送一个像JSON一样标记的镜像,

那是我的两分钱

答案 1 :(得分:2)

除了跟踪执行情况(如Daxon发布的那样),您还需要确保按钮名为_eventId_next和_eventId_skip。 g:submitbutton通常很聪明,可以为你做这个,但它可能不在remoteForm中。

另外,我的网络流代码使用参数执行,而不是flowExecutionKey - 您使用的是哪个版本的Grails?

答案 2 :(得分: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>