如何从JavaScript和Grails访问变量?

如何从JavaScript和Grails访问变量?,javascript,grails,gsp,Javascript,Grails,Gsp,我有一个JASONList类型的变量,它在模板中呈现 有没有办法从JavaScript函数内部访问此列表 假设我想调整大小以适应屏幕上的所有对象。无需进行数据库调用并从Ajax重新读取整个列表 假设模板执行以下操作: <g:each var="report" in="${reportList?.myArrayList}"> <li style="display:inline; list-style:none;"> <img src=" ${report

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

有没有办法从JavaScript函数内部访问此列表

假设我想调整大小以适应屏幕上的所有对象。无需进行数据库调用并从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>
<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>""" %>

  • 函数调整大小(列表){
    if(list.size我不知道,但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) // Pseudocode
                list.subList() // Pseudocode
        }
        window.onresize = resize("${reportList}")
    </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>""" %>
    
    
    

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


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

    我不确定为什么您的${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不知道如何处理您的报表列表基本上,如果您在Grails中使用POJO,Grails as JSON转换不是很智能。它所做的只是在对象上进行toString,而不是潜在地查看所有公共访问器,等等


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

    是的,获取子列表和大小只是psudo代码。。无论如何,它都是对象的JSON表示……但是由于GSP是在服务器上呈现的,所以在将JSON对象发送到函数时应该填充它,对吗?@user:实际上我并不熟悉Grails/GSP(JSP更像我的东西),但只要您将解析后的JSON传递到JavaScript函数中,就应该没问题了。呃,好吧,是的,我认为这就是断开连接,对${reportList}的引用作为字符串表示而不是它所表示的JSON对象发送,可能我需要在服务器端以控制器支持的变量处理这个问题………我解决了我的问题,基本上,如果在grails中使用POJO,grails as JASON转换不是很聪明,它所做的只是在对象上执行toString可能会查看所有的公共访问器等…(有点令人失望,但基本上我需要在POJO的toString方法中创建JSON转换)