2017-08-29 11 views
5

मैं जावास्क्रिप्ट में एक स्प्रिंग चर का उपयोग करने के लिए कोशिश कर रहा हूँ स्प्रिंग चर का उपयोग करना:जावास्क्रिप्ट में

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

यह ''' के साथ काम कर रहा है लेकिन समस्या यह है कि इस तरह मेरे पास ऑब्जेक्ट (हैशपैप) नहीं है लेकिन स्ट्रिंग है इसलिए मैं कुछ नहीं कर सकता 'xxx [' STATE1 ']' – NikNik

+0

ऐसा लगता है कि आपका नक्शा एक अजीब तरीके से serialized है। [डॉक्टर] के अनुसार (http://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html#advanced-inlined-evaluation-and-javascript-serialization) थाइमेलीफ को मानचित्र को सही ढंग से लिखना चाहिए। क्या आपके पास क्लासपाथ में जैक्सन लाइब्रेरी है? –

उत्तर

0

मैं अपनी टिप्पणी का उपयोग कर मेरी समस्या हल इससे पहले कि मुझे अपनी ऑब्जेक्ट को क्रमबद्ध करने की आवश्यकता है (यह अजाक्स कॉल नहीं है इसलिए मुझे इसे मैन्युअल रूप से क्रमबद्ध करने की आवश्यकता है):

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]} अमान्य जावास्क्रिप्ट ऑब्जेक्ट के कारण है।

स्पष्टीकरण बहुत छोटा है: आप सर्वर साइड प्रतिपादन का उत्पाद देख रहे हैं (आप थाइमेलीफ को वसा के रूप में उपयोग कर रहे हैं क्योंकि मैं th:inline टैग द्वारा सुझाव दे सकता हूं)। तो सर्वर पर आपके मानचित्र ऑब्जेक्ट को {STATE1=[a, b, c, d]} स्ट्रिंग के रूप में प्रस्तुत किया जाता है। अपने क्लाइंट (ब्राउज़र) पर आपको इस स्ट्रिंग के साथ पृष्ठ मिलता है, और कुछ भी नहीं। पहले से कोई जावा ऑब्जेक्ट नहीं है। बस स्ट्रिंग। और यह स्ट्रिंग जावास्क्रिप्ट में किसी ऑब्जेक्ट का अमान्य प्रारंभिक है।

तो आप बस इस तरह से मानचित्र का उपयोग नहीं कर सकते हैं। आप इसे JSON.parse के साथ पार्स नहीं कर सकते क्योंकि यह अमान्य JSON है (= के बजाय उपयोग किया जाना चाहिए)।

आशा है कि इससे मदद मिलती है!

पीएस आप जावास्क्रिप्ट में : साथ = बदलने का प्रयास करेगा अगर यह दूसरी तरह के काम करेंगे आपकी अपेक्षा से: सरणी [a, b, c, d] नाम a, b, c और d साथ चर की एक सरणी के रूप में इलाज किया जाएगा ताकि आप में यह ecnlose करना होगा ''। लेकिन मैं इस विचार को फेंकने और आपको दृष्टिकोण पर पुनर्विचार करने का सुझाव देता हूं। इसका उपयोग नहीं किया जाना चाहिए। एकल उद्धरण याद आ रही

1) वहाँ गया था:

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

2) वस्तु इतनी पार्स किया जाना चाहिए:

var hashmap = $.parseJSON(xxx); 

3) और

+0

@NikNik जावा ऑब्जेक्ट के रूप में - निश्चित रूप से। सर्वर साइड प्रतिपादन का उपयोग करके आपको स्ट्रिंग प्रस्तुति मिल जाएगी। आप गंदे हैक बना सकते हैं: मानचित्र फ़ील्ड के साथ एक रैपर ऑब्जेक्ट बनाएं और 'toString' को ओवरराइड करें ताकि आप वहां वैध JSON उत्पन्न कर सकें। यह काम करना चाहिए, हालांकि यह इतना गंदा है कि मैं इसे साठ फुट के ध्रुव (दक्षिण पार्क (कार्ट) से कार्टमैन) से छूंगा। आपको इसे प्रतिक्रिया निकाय (सर्वर पर) में लिखना चाहिए और जावास्क्रिप्ट में एजेक्स कॉल करना चाहिए (यदि आप एंगुलरजेएस, एंगुलर, रीएक्टजेएस, वीयूजेएस आदि जैसे किसी भी फ्रंटेंड फ्रेमवर्क का उपयोग करने की योजना नहीं बना रहे हैं)। –

+0

मैंने पोस्ट किया कि मैंने अपनी समस्या का हल कैसे किया। आपके प्रयास के लिए धन्यवाद :) मैंने आपका जवाब ऊपर उठाया। – NikNik

संबंधित मुद्दे