【问题标题】:Using Grails SubmitToRemote onFailure option not working使用 Grails SubmitToRemote onFailure 选项不起作用
【发布时间】:2014-03-09 02:06:57
【问题描述】:

我正在尝试使用 Grails 标记 SubmitToRemote 来处理失败消息(例如验证域对象上的错误)。

我的标签 submitToRemote 是:

<g:submitToRemote
      url="[action: 'save']"
      update="[success: 'wizard', failure: 'error']"
      onFailure="onFailure(data, code)"
      name="submit"
      class="btn btn-large btn-inverse"
      value="Save"/>

我的 onFailure 函数是:

   <g:javascript>
        function onFailure(data, code){
            document.getElementById('errors').style.display = 'inline';
            $('#errors').html(data);
        }

    </g:javascript>

最后是 grails 动作:

(...)
if(!plan.validate()){
    render status: 400, text: "This plan cannot be saved. Fill all fields and try again."
    return
}

我怎样才能正确地做到这一点?

【问题讨论】:

  • 怎么不工作了?你在看什么?你在浏览器中看到 400 了吗?
  • 我不确定我必须在 onFailure 函数中设置哪些参数。传递数据和代码属性不起作用。
  • 浏览器控制台中的任何错误?? IDE控制台中的任何异常?动作是否被正确调用?
  • 不,IDE 中没有浏览器错误或异常。正在调用 Action 并正确呈现错误。这很奇怪......

标签: javascript ajax grails gsp


【解决方案1】:

我不知道现在这是否有帮助,但肯定可以帮助其他人。

我成功地调用并将消息传递给 onFailure 方法。

所以我就是这样做的,我在控制器中设置了错误代码和文本,如下:

render(status: 403, text: 'Request failed to complete due to some error.')

然后在 gsp 上,我使用 XMLHttpRequest 提取消息:

<g:formRemote onFailure="onFailure(XMLHttpRequest.responseText)" ...>

根据我的发现,我看到 grails 结束并为 onFailure 函数创建了下面的 ajax。

error:function(XMLHttpRequest,textStatus,errorThrown){onFailure(XMLHttpRequest.responseText)...

Grails 版本:2.5.0

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    我尝试使用 onFailure 但使用 onSuccess 并实现了类似的功能。

    <g:submitToRemote
          url="[action: 'save']"
          update="show_response"
          onSuccess="handleResponse(data, code)"
          name="submit"
          class="btn btn-large btn-inverse"
          value="Save"/>    
    

    show_response 是您希望在其中显示响应(成功/失败)的 div

    在控制器或服务中

    def save()  {
      //your data CRUD operation logic goes here
      // for success return success response
     return new Response("sucess")
      // for failure or error return error response
    return new Response("error")
    
    }
    

    编写一个 groovy 类来处理响应,例如 Response.groovy

    class Response {  
            boolean success  
            def errors = []           
    
            Response(String errorMessage) {  
                this.success = false  
                this.errors << [message: errorMessage]  
            }  
            ....  
        } 
    

    最后你的 gsp 代码看起来像

     <g:javascript>
        function handleResponse(response,textStatus){
        if(response.success === true){
         //use the div and write the UI to show message
         } else {
         //use the div and write the UI to show message
         }    
        </g:javascript>
    

    可能需要进行细微的更改才能使其正常工作,但我相信它适合您的需要

    【讨论】:

    • 我明白你已经完成了。但这是正确的方法吗?那么 submitToRemote 标签中 onFailure 的功能是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-03
    • 1970-01-01
    • 2019-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多