我有一个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转换...
答案 0 :(得分:4)
Grails变量仅存在于服务器端。 JavaScript在浏览器(客户端)中运行。发送到浏览器的所有内容都是字符串,因此虽然您可以使用Grails生成window.onresize = resize("${reportList}")
之类的JavaScript,但浏览器只会看到${reportList}
评估的字符串到。
这意味着,如果您使用Grails将变量传递给resize()
JavaScript函数,则参数(list
)将只是一个字符串 - 您将无法访问服务器 - list.size
或list.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转换。