2012-04-19 20 views
52

मैं हैंडलबार टेम्पलेट्स का उपयोग कर रहा हूं और जेएसओएन डेटा पहले से ही [ऑब्जेक्ट ऑब्जेक्ट] में दर्शाया गया है, मैं हैंडलबार्स के बाहर इस डेटा को कैसे पार्स कर सकता हूं? उदाहरण के लिए, मैं एक हैंडलबार्स टैग के माध्यम से पृष्ठ पर एक जावास्क्रिप्ट चर को पॉप्युलेट करने की कोशिश कर रहा हूं, लेकिन यह काम नहीं करता है।ऑब्जेक्ट ऑब्जेक्ट के बजाय हैंडलबार.जेएस पार्स ऑब्जेक्ट

कोई सुझाव? धन्यवाद!

संपादित करें:

स्पष्ट करने के लिए, मैं templating के लिए डब्ल्यू/Handlebars ExpressJS उपयोग कर रहा हूँ।

var user = {} 
user = {'id' : 123, 'name' : 'First Name'} 

res.render('index', {user : user}); 

तब मेरे index.hbs टेम्पलेट में, मैं अब एक {{user}} वस्तु है: मेरे मार्ग में, मैं इस किया है। मैं ऑब्जेक्ट के माध्यम से फिर से ठीक करने के लिए {{#each}} का उपयोग कर सकता हूं। हालांकि, मैं भी Backbonejs उपयोग कर रहा हूँ और मैं इस जैसे एक दृश्य के लिए इस डेटा पास करना चाहते हैं,:

myView = new myView({user : {{user}});

समस्या यह है कि {{user}} बस अगर मैं इसे कंसोल में डाल स्रोत में [Object object] से पता चलता है .log मुझे एक त्रुटि मिलती है, 'अप्रत्याशित पहचानकर्ता'।

+0

आप पर विस्तृत करना होगा क्या आप [कोड का प्रासंगिक स्निपेट] (http://sscce.org/) प्रदान कर सकते हैं और 'ऑब्जेक्ट ऑब्जेक्ट]' की बजाय आप क्या उम्मीद कर रहे हैं इसका विवरण दे सकते हैं?यदि आप ऑब्जेक्ट की चाबियाँ/मानों को देखने की कोशिश कर रहे हैं, तो आप डीबगर या ['JSON.stringify'] (http://caniuse.com/json) के साथ' console.log' का उपयोग करना चाहेंगे। –

+0

Console.log दिखाता है [ऑब्जेक्ट ऑब्जेक्ट] भी। मैं बेहतर व्याख्या करने के लिए पोस्ट अपडेट करूंगा। – dzm

उत्तर

115

जब {{user}} outputting, हैंडल पहले user के .toString() मान प्राप्त होगा। सादा Object एस के लिए, default result of this is the "[object Object]" आप देख रहे हैं।

अधिक उपयोगी कुछ पाने के लिए आपको या तो वस्तु का एक विशिष्ट गुण प्रदर्शित करने के लिए चाहता हूँ:

{{user.id}} 
{{user.name}} 

या, आप उपयोग कर सकते हैं/वस्तु को अलग ढंग से फ़ॉर्मेट करने के लिए एक सहायक को परिभाषित:

Handlebars.registerHelper('json', function(context) { 
    return JSON.stringify(context); 
}); 
myView = new myView({ 
    user : {{{json user}}} // note triple brackets to disable HTML encoding 
}); 
+12

यह होना चाहिए: {{{json user}}}, अन्यथा जेसन स्ट्रिंग को एन्कोड किया जाएगा। –

+0

धन्यवाद, यह सही है। एक्सप्रेस उपयोगकर्ताओं के लिए: 'app.set ('इंजन देखें', 'hbs'); var हैंडलबार = आवश्यकता ('एचबीएस'); ' – Oneiros

+2

बढ़िया काम करता है। इसके अलावा [एक्सप्रेस-हैंडलबार्स] (https://github.com/ericf/express-handlebars) उपयोगकर्ताओं के लिए: 'var exphbs = आवश्यकता (' एक्सप्रेस-हैंडलबार्स '); app.engine ('हैंडल', exphbs ({\t \t \t \t \t \t सहायकों: { \t \t \t \t json: समारोह (संदर्भ) { \t \t \t \t \t वापसी JSON.stringify (संदर्भ); \t \t \t \t} \t \t \t} \t \t})); – JayChase

1

आप जेएसओएन ऑब्जेक्ट के अंदर टेम्पलेटिंग सिंटैक्स {{ }} पास करने की कोशिश कर रहे हैं जो मान्य नहीं है।

आप इसके बजाय यह करने के लिए आवश्यकता हो सकती है:

myView = new myView({ user : user });

3

मैं नोड js में सर्वर-साइड templating का उपयोग कर रहा है, लेकिन इस क्लाइंट साइड के साथ-साथ आवेदन कर सकते हैं। मैं नोड में Jonathan के जेसन सहायक का पंजीकरण करता हूं। मेरे हैंडलर में, मैं Res.locals के माध्यम से संदर्भ (जैसे एड्रेसबुक) जोड़ता हूं। (के रूप में Jim Liu से कहा)

<script> 
    {{#if addressBook}} 
    console.log("addressBook:", {{{json addressBook}}}); 
    window.addressBook = {{{json addressBook}}}; 
    {{/if}} 
</script> 

नोट ट्रिपल curlies: तब मैं इस प्रकार संदर्भ चर क्लाइंट साइड स्टोर कर सकते हैं।

6

आप कर सकते हैं सरल stringify JSON:

var user = {} 
user = {'id' : 123, 'name' : 'First Name'}; 
// for print 
user.stringify = JSON.stringify(user); 
फिर टेम्पलेट प्रिंट में

द्वारा: "। काम नहीं करता है"

{{{user.stringify}}}; 
संबंधित मुद्दे