【问题标题】:Grails - render Map from controller via Ajax using JSONGrails - 使用 JSON 通过 Ajax 从控制器渲染地图
【发布时间】:2012-03-29 05:55:22
【问题描述】:

我知道这是一个经常出现/经典的话题,但到目前为止我没有找到任何对我有帮助的东西。 我正在尝试从我的控制器渲染地图。这是由 Ajax 请求引起的,应该被 Javascript 函数“onSuccess”“吃掉”。

这是我的 Javascript.gsp 视图

<g:javascript>
function updateVideoLoad(e) {
var map = eval("("+e.responseText+")") // evaluate the JSON
$('#resultsChecker').html(map.urlAccepted + ' - ' + map.provider + ' - ' + map.videoId + ' - ' + map.videoTag)
}
</g:javascript>
<g:formRemote name="myForm" update="" url="[controller: 'project', action:'addVideo']" onSuccess="updateVideoLoad(e)">        
    ...      
</g:formRemote>

这是我的控制器

    import grails.converters.JSON

class ProjectController {

    def addVideo() {
       ...
    def videoMap = [urlAccepted: videoList[0], provider: videoList[1], videoId: videoList[2], videoTag: videoList[3]]
    render videoMap as JSON
    }

在我看来,它与Grails documentation 中提供的示例完全相同。 但是它不起作用。在浏览器控制台上,我得到:

Uncaught ReferenceError: e is not defined

来自我的g:remoteForm

欢迎提出任何建议。 感谢您的帮助。

【问题讨论】:

  • 这是代码或问题中的拼写错误吗? !=
  • 对不起,我编辑了帖子以更正它。这不在原始代码中。

标签: javascript json grails controller render


【解决方案1】:

我在这里猜测,但它看起来像是文档中的错误。我希望这部分:

 onSuccess="updateVideoLoad(e)"
                           ^^^

应该是:

 onSuccess="updateVideoLoad(data,textStatus)"
                           ^^^^^^^^^^^^^^^^^

查看生成的代码(在 Grails 2.0 下),这些是返回中使用的变量:

<form onsubmit="jQuery.ajax({type:'POST',data:jQuery(this).serialize(), url:'/project/addVideo',success:function(data,textStatus){updateVideoLoad(e);},error:function(XMLHttpRequest,textStatus,errorThrown){}});return false"
    method="post" action="/project/addVideo" id="myForm">

查看生成代码中的success 属性。

【讨论】:

  • 非常感谢您的帮助。我修改了这些函数:onSuccess="updateVideoLoad(data,textStatus)"function updateVideoLoad(data, textStatus) { ... }。现在我收到Uncaught TypeError: Cannot read property 'urlAccepted' of undefined ("data")。所以我继续前进,因为我现在实际上正在调用 javascript 函数,但仍然无法解析 JSON Map。
【解决方案2】:

这似乎有效:

<g:formRemote name="myForm" update="" url="[controller: 'project', action:'addVideo']" onComplete="updateVideoLoad(XMLHttpRequest)">

是否有地方可以获取有关这些 javascript 事件的文档(onCompleteonSuccess、...)?

【讨论】:

【解决方案3】:

这似乎是一个文档错误。如果使用 JQuery(Grails 2.0 的默认值),变量应该是 'data' 而不是 'e' 并且它将包含您从控制器返回的 JSON 对象,并且不需要像在文档中那样评估或解析它.

【讨论】:

    【解决方案4】:

    我遇到了同样的问题,但我正在使用 Dojo。

    如果你使用dojo,你应该使用变量名'response':

    onComplete="updateVideoLoad(response)"
    

    它适用于 Dojo。

    【讨论】:

      猜你喜欢
      • 2017-07-16
      • 2015-11-09
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 2012-01-31
      • 2012-02-28
      • 2012-01-11
      • 2012-01-06
      相关资源
      最近更新 更多