【问题标题】:Grails WebFlow with Ajax使用 Ajax 的 Grails WebFlow
【发布时间】:2011-01-04 06:59:10
【问题描述】:

我正在尝试使用 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);
            }
});

每个状态(flow1、flow2、flow3)的 GSP 包含一个代码片段,该代码片段具有 remoteForm 和需要 next 并跳过提交按钮以转换到下一个状态并因此更新“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>

【问题讨论】:

    标签: ajax grails spring-webflow


    【解决方案1】:

    我遇到了同样的问题,差点想通了,

    您需要做的是发回 Grails webflow "_flowExecutionKey" 跟踪当前状态,

    我相信您已经看过 this,这是 Google 找到的唯一一个不错的结果。

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

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

    但是您可以尝试使用“_flowExecutionKey”以及您想要发回的数据发送一个标记为 JSON 的寺庙,

    这是我的两分钱

    【讨论】:

      【解决方案2】:

      除了跟踪执行(正如 Daxon 发布的那样),您还需要确保您的按钮被命名为 _eventId_next 和 _eventId_skip。 g:submitbutton 通常足够聪明,可以为您执行此操作,但它可能不在 remoteForm 内。

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

      【讨论】:

      • 那么,你能给我举一个你的 Gsp 的例子吗? Ajax 调用和处理响应,因为您必须打印出 Ajax 调用中的链接,您能否进一步解释您的“参数执行”
      • 主要技巧是处理按钮。无需捕获 flowExecutionKey,因为 Grails 已经将其作为执行隐藏输入变量提供。但是在发布 ajax 时,使用序列化的表单数据,必须发送正确的按钮名称,例如如果单击下一步,则在帖子数据中发送 _eventId_next。
      • @kaychaks - 所以你对我说我所要做的就是拥有正确的网址,例如ajax POST/GET 中的“_eventid_next”,就这样?所以我不必关心我通过提交和更多 ajax 请求发送什么“?execution=e1s1”?
      • 您仍然需要确保每个请求都包含执行参数,否则服务器无法知道请求的流向。通常 grails 会为您添加它(如果您使用 g:form 等标签)。
      • @leebutts - 好的,执行参数是“flowExecutionKey”的值,e1s1,e2s3,我在每个 ajax 请求中都会收到它。假设第一个 ajax 请求 url 需要是例如“/create/whatever?execution=e1s2&_eventId=ajaxSearch” 然后我收到下一个执行参数为“e1s3”,因此下一个后续 ajax 请求必须具有更新的执行值。 “/create/whatever?execution=e1s3&_eventId=ajaxNext”。我并没有真正使用那些grails标签,所以我每次都必须动态地将它添加到url中?
      【解决方案3】:

      这里的解决方案在 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>
      

      【讨论】:

        猜你喜欢
        • 2013-03-23
        • 1970-01-01
        • 2011-12-14
        • 1970-01-01
        • 1970-01-01
        • 2011-05-28
        • 1970-01-01
        • 2011-05-04
        • 1970-01-01
        相关资源
        最近更新 更多