2017-08-29 16 views
5

Tôi đang cố gắng sử dụng một biến mùa xuân trong javascript:Sử dụng biến mùa xuân trong javascript

Map<String, List<String>> states; 

và tôi thấy một số thông tin here

vì vậy tôi cố gắng:

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

Trong tôi tab nguồn của trình duyệt Tôi có một cái gì đó như:

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

và lỗi là: Uncaught SyntaxError: Invalid shorthand property initializer.

Tôi cũng đã thử với: var xxx = /*[[${states}]]*/ 'foo'; và nếu tôi in console.log(xxx), tôi nhận được 'foo'.

+0

bạn đã cố gắng gói 'cái xxx' giá trị biến với dấu ngoặc kép để làm cho nó một chuỗi? chỉ để kiểm tra! –

+0

Nó đang làm việc với '''' nhưng vấn đề là bằng cách này tôi không có đối tượng (hashmap) nhưng String vì vậy tôi không thể làm một cái gì đó như 'xxx ['STATE1']' – NikNik

+0

Nó trông giống như bản đồ của bạn được sắp xếp theo một cách kỳ lạ. Theo [doc] (http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#advanced-inlined-evaluation-and-javascript-serialization) thymeleaf nên viết Bản đồ chính xác. Bạn có thư viện Jackson trong classpath của bạn? –

Trả lời

0

tôi giải quyết vấn đề của tôi sử dụng bình luận của bạn:

1) Có được thiếu dấu nháy đơn:

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

2) Đối tượng phải được phân tích như vậy:

var hashmap = $.parseJSON(xxx); 

3) Và trước khi tôi cần serialize đối tượng của tôi (đây không phải là cuộc gọi ajax vì vậy tôi cần serialize nó theo cách thủ công):

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

Vì vậy, bây giờ tôi có thể đọc đối tượng của tôi:

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

sẽ in [a, b, c, d] và tôi có thể lặp qua:

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

Lỗi này là do {STATE1=[a, b, c, d]} là đối tượng Javascript không hợp lệ.

Giải thích là rất nhỏ: bạn đang thấy sản phẩm hiển thị phía máy chủ (bạn đang sử dụng Thymeleaf như chất béo như tôi có thể đề xuất bằng thẻ th:inline). Vì vậy, trên máy chủ, đối tượng bản đồ của bạn được hiển thị dưới dạng chuỗi {STATE1=[a, b, c, d]}. Trên trình duyệt (trình duyệt) của bạn, bạn nhận được trang có chuỗi này, không có gì khác. Đã không có bất kỳ đối tượng Java nào. Chỉ cần chuỗi. Và chuỗi này là khởi tạo không hợp lệ của một đối tượng trong Javascript.

Vì vậy, bạn chỉ đơn giản là không thể sử dụng bản đồ theo cách này. Bạn không thể phân tích cú pháp này với JSON.parse vì nó không hợp lệ JSON (phải có : được sử dụng thay vì =).

Hy vọng điều này sẽ hữu ích!

P.S. Nếu bạn sẽ cố gắng thay thế = bằng : bằng Javascript, nó sẽ hoạt động theo cách khác bạn mong đợi: mảng [a, b, c, d] sẽ được coi là một mảng biến với tên a, b, cd, do đó bạn sẽ phải tiết lộ nó ''. Nhưng tôi đề nghị vứt bỏ ý tưởng này và suy nghĩ lại cách tiếp cận của bạn. Nó không phải là cách nó nên được sử dụng.

+0

@NikNik là đối tượng Java - chắc chắn. bằng cách sử dụng hiển thị phía máy chủ, bạn sẽ nhận được biểu diễn chuỗi. bạn có thể làm cho việc hack bẩn: tạo một đối tượng bao bọc với trường bản đồ và ghi đè 'toString' để bạn có thể tạo ra JSON hợp lệ. nó sẽ hoạt động, tuy nhiên nó bẩn đến nỗi tôi sẽ không chạm vào nó với một cột sáu mươi mét (Cartman từ South Park (c)). bạn nên viết nó trong cơ thể đáp ứng (trên máy chủ) và thực hiện cuộc gọi AJAX trong Javascript (nếu bạn không có kế hoạch sử dụng bất kỳ khung công tác frontend nào như AngularJS, Angular, ReactJS, VueJS và vv). –

+0

Tôi đã đăng cách tôi giải quyết vấn đề của mình. Cảm ơn bạn đã nỗ lực :) Tôi upvoted câu trả lời của bạn. – NikNik

Các vấn đề liên quan