Grails - 使用JSON从控制器通过Ajax渲染Map

时间:2012-03-29 05:55:23

标签: javascript json grails controller render

我知道这是一个经常性/经典主题,但到目前为止我找不到任何帮助我的东西。 我试图从我的控制器渲染一个地图。这是由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

任何建议都是最受欢迎的。 谢谢你的帮助。

4 个答案:

答案 0 :(得分: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属性。

答案 1 :(得分:1)

这似乎有效:

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

是否有位置可以获取有关这些javascript事件的文档(onCompleteonSuccess,...)?

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

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

onComplete="updateVideoLoad(response)"

它适用于Dojo。