1

我有一个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

4 回答 4

4

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

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

于 2010-10-10T14:23:06.370 回答
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>""" %>
于 2010-10-10T06:07:44.067 回答
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 对象。

于 2010-10-11T14:44:25.193 回答
-1

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

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

于 2010-10-15T16:38:44.380 回答