我如何从JavaScript和Grails访问变量?

时间:2010-10-10 05:10:39

标签: javascript grails gsp

我有一个Grails变量,它是在模板中呈现的JASONList类型。

有没有办法从JavaScript函数中访问此列表?

假设我希望onresize适合屏幕上的所有对象。没有进行数据库调用并从Ajax中重新获取整个列表...

假设模板做了类似的事情:

<g:each var="report" in="${reportList?.myArrayList}">
  <li style="display:inline; list-style:none;">
    <img src="  ${report?.img}">
  </li>
</g:each>
<script type="text/javascript">
    function resize(list) {
        if (list.size <givenSize) // Pseudocode
            list.subList() // Pseudocode
    }
    window.onresize = resize("${reportList}")
</script>

这个问题是由于某种原因,Grails gsp不会将“$ {reportList}”呈现为列表。相反,它将其呈现为字符串“$ {reportList}”。

我可能认为这个问题完全错了,但有没有办法调整这些对象的大小或通过document.getElementById或其他类似的东西来获取它们?

$ reportList由POJO填充为JSON转换...

4 个答案:

答案 0 :(得分:4)

Grails变量仅存在于服务器端。 JavaScript在浏览器(客户端)中运行。发送到浏览器的所有内容都是字符串,因此虽然您可以使用Grails生成window.onresize = resize("${reportList}")之类的JavaScript,但浏览器只会看到${reportList}评估的字符串到。

这意味着,如果您使用Grails将变量传递给resize() JavaScript函数,则参数(list)将只是一个字符串 - 您将无法访问服务器 - list.sizelist.subList()等列表方法,因为list变量不再是列表;它只是一个字符串

答案 1 :(得分:0)

我不知道,但也许Grails不想评估script标签内的表达式。动态生成的脚本不是一个很好的做法。

但是在找到确切原因之前,你可以尝试这样的事情:

<g:each var="report" in="${reportList?.myArrayList}">
  <li style="display:inline; list-style:none;">
    <img src="  ${report?.img}">
  </li>
</g:each>
<%= """<script type=\"text/javascript\">
function resize(list){
  if(list.size <givenSize) //posudo code
     list.subList() // psudocode
}

window.onresize = resize(\"$reportList\")
</script>""" %>

答案 2 :(得分:0)

我不确定为什么你的$ {reportList}被呈现为$ {reportList},因为当我执行以下操作时:

var t = "${taskList}";

我的HTML中有以下内容:

var t = "[com.wbr.highbar.Task : 1, com.wbr.highbar.Task : 4, com.wbr.highbar.Task : 2, com.wbr.highbar.Task : 5]";

那就是说,你仍然会遇到问题,因为JavaScript不知道如何处理你的reportList。如果它是纯JSON,你需要eval()它,以便它变成一个JavaScript对象。

答案 3 :(得分:-1)

我发现了我的问题。基本上如果你在Grails中使用POJO,那么Grails作为JSON转换并不是很聪明。它所做的只是对象上的toString,而不是潜在地查看所有公共访问器等。

有点令人失望,但基本上我需要在我的POJO的toString方法中创建JSON转换。