2017-08-29 39 views
5

我想在JavaScript中使用Spring的可變彈簧變量:使用在JavaScript

Map<String, List<String>> states; 

,我發現了一些信息here

所以我嘗試:

<script th:inline="javascript"> 
    /*<![CDATA[*/ 
    var xxx = ${states}; 
    console.log(xxx); 
    /*]]>*/ 
</script> 

在我瀏覽器的源代碼標籤我有類似的東西:

var xxx = {STATE1=[a, b, c, d]}; 
console.log(xxx); 

,錯誤是:Uncaught SyntaxError: Invalid shorthand property initializer

我也試過:var xxx = /*[[${states}]]*/ 'foo';如果我打印console.log(xxx),我得到'foo'

+0

做你試圖包裹'xxx'變量值與引號讓它成爲一個字符串?只是爲了檢查! –

+0

它使用''''但問題是這樣我沒有對象(hashmap),但字符串,所以我不能做像'xxx ['STATE1']' – NikNik

+0

它看起來像你的地圖以奇怪的方式序列化。根據[doc](http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#advanced-inlined-evaluation-and-javascript-serialization)thymeleaf應正確地編寫地圖。你的班級路線中是否有Jackson圖書館? –

回答

0

我用您的意見解決我的問題在我需要序列化我的對象之前(這不是ajax調用,所以我需要手動序列化):

Map<String, List<String>> states... 
    model.addAttribute("states", new ObjectMapper().writeValueAsString(states)); 

所以我現在能讀我的對象:

var myList = hashmap['STATE1']; 
console.log(myList) 

將打印[a, b, c, d],我可以遍歷:

for(i in myList){ 
    console.log(myList[i]); 
} 
2

此錯誤是由於{STATE1=[a, b, c, d]}是無效的Javascript對象。

解釋是非常微不足道的:你看到服務器端渲染的產品(你使用Thymeleaf的脂肪,因爲我可以通過th:inline標籤建議)。所以在服務器上你的地圖對象被渲染爲{STATE1=[a, b, c, d]}字符串。在你的客戶端(瀏覽器)上,你得到了這個字符串的頁面,沒有別的。目前已經沒有任何Java對象。只是字符串。而這個字符串是Javascript中對象的無效初始化。

所以你根本就不能用這種方式使用地圖。你不能用JSON.parse解析這個,因爲它是無效的JSON(應該用:代替=)。

希望這會有所幫助!

P.S.如果您嘗試在Javascript中替換=:,它將以您預期的方式工作:數組[a, b, c, d]將被視爲一個名稱爲a,b,cd的變量數組,因此您必須將其忽略''。但我建議放棄這個想法,並重新思考你的方法。這不是它應該使用的方式。

1)缺少的單引號:

<script th:inline="javascript"> 
    /*<![CDATA[*/ 
    var xxx = '${states}'; 
    console.log(xxx); 
    /*]]>*/ 
</script> 

2)的對象必須在這樣解析:

var hashmap = $.parseJSON(xxx); 

3)又

+0

@NikNik作爲Java對象 - 當然。使用服務器端渲染,你會得到字符串表示。你可以做出骯髒的黑客攻擊:使用map字段創建一個包裝對象並覆蓋'toString',這樣就可以生成有效的JSON。它應該工作,但它太髒了,我不會用一個六十英尺的杆子(南方公園的Cartman(c))來觸碰它。你應該把它寫在響應體(在服務器上)並在Javascript中進行AJAX調用(如果你不打算使用AngularJS,Angular,ReactJS,VueJS等任何前端框架)。 –

+0

我發佈了我是如何解決我的問題的。謝謝你的努力:)我upvoted你的答案。 – NikNik