【问题标题】:How I access a variable from JavaScript and Grails?如何从 JavaScript 和 Grails 访问变量?
【发布时间】:2010-10-10 05:10:38
【问题描述】:

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

【问题讨论】:

    标签: javascript grails gsp


    【解决方案1】:

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

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

    【讨论】:

    • 是的,获取子列表和大小只是伪代码。它以任何方式表示对象的 JSON ......但由于 GSP 是在服务器上呈现的,因此在发送它时应该填充 JSON 对象到函数对吗?
    • @user:我实际上并不熟悉 Grails/GSP(我更喜欢 JSP),但只要您将 parsed JSON 传递给 JavaScript 函数,你应该没事。
    • err 好吧,是的,我认为那是断开连接,对 ${reportList} 的引用是作为字符串表示而不是它表示的 JSON 对象发送的,也许我需要处理这个在由控制器支持的变量中的服务器端 ... ... ...
    【解决方案2】:

    我不知道,但也许 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>""" %>
    

    【讨论】:

      【解决方案3】:

      我不确定为什么您的 ${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 对象。

      【讨论】:

      • 我发现了我的问题,基本上如果你在 grails 中使用 POJO,grails 因为 JASON 转换不是很聪明,它所做的只是对象上的 toString,而不是潜在地查看所有公共访问器等...(有点令人失望,但基本上我需要在我的 POJO 的 toString 方法中创建 JSON 转换)
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-01-01
        • 1970-01-01
        • 2015-07-22
        • 1970-01-01
        • 1970-01-01
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 2011-05-26
        相关资源
        最近更新 更多