簡體   English   中英

如何從JavaScript和Grails訪問變量?

[英]How I access a variable from JavaScript and Grails?

我有一個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或類似性質的東西來獲取它們呢?

POJO將$ reportList填充為JSON轉換...

Grails變量僅存在於服務器端。 JavaScript在瀏覽器(客戶端)中運行。 發送給瀏覽器的所有內容都是字符串,因此,盡管您可以使用Grails生成諸如window.onresize = resize("${reportList}")類的JavaScript,但瀏覽器將僅看到${reportList}評估的字符串至。

這意味着,如果您使用Grails將變量傳遞給resize() JavaScript函數,則參數( list )永遠只能是字符串-您將無法訪問服務器端列表方法,如list.sizelist.subList() ,因為list變量不再是列表; 這只是一個字符串

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

我不確定為什么將您的$ {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會因為JSON轉換不是很聰明。 它所做的只是在對象上使用toString,而不是潛在地查看所有公共訪問器等。

有點令人失望,但基本上我需要在POJO的toString方法中創建JSON轉換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM