2012-06-22 14 views
18

मेरे पास एक बहुत बड़ी वस्तु है जिसे मुझे क्लाइंट स्क्रिप्ट में किसी फ़ंक्शन को पास करने की आवश्यकता है। मैंने JSON.stringify का उपयोग करने का प्रयास किया है, लेकिन इस दृष्टिकोण के साथ कुछ मुद्दों में भाग लिया है - अधिकतर प्रदर्शन संबंधित। क्या ईजे में ऐसा कुछ करना संभव है?क्लाइंट को नोड/एक्सप्रेस + ईजेएस में ऑब्जेक्ट पास करना?

app.get('/load', function(req, res) { 
    var data = { 
     layout:'interview/load', 
     locals: { 
      interview: '', 
      data: someLargeObj 
     } 
    }; 
    res.render('load', data); 
}); 

और मेरे मुवक्किल लिपि में, मैं इस वस्तु एक समारोह के लिए इतना

<script type="text/javascript"> 
    load(<%- data %>); // load is a function in a client script 
</script> 

की तरह जब मैं यह कोशिश से होकर गुजरेगा मैं या तो

<script type="text/javascript"> 
    load(); 
</script> 

या

<script type="text/javascript"> 
    load([Object object]); 
</script> 
मिल
+0

'JSON.stringify' एकमात्र तरीका है। –

उत्तर

8

यह अपेक्षित व्यवहार है। आपका टेम्पलेट इंजन आपकी ऑब्जेक्ट से एक स्ट्रिंग बनाने की कोशिश कर रहा है जो [ऑब्जेक्ट ऑब्जेक्ट] की ओर जाता है। यदि आप वास्तव में इस तरह के डेटा को पास करना चाहते हैं तो मुझे लगता है कि आपने ऑब्जेक्ट को स्ट्रिंग करके सही चीज की है।

+1

'JSON.stringify (someLargeObj)' – alessioalex

48

Node.js में:

res.render('mytemplate', {data: myobject});

EJS में:

<script type='text/javascript'> 
    var rows =<%-JSON.stringify(data)%> 
</script> 
+3

क्या आप मुझे '<% -' और '<% =' के बीच का अंतर बता सकते हैं? और अंत में क्यों नहीं; – gr3g

+11

'<%= x %>' एक्स के मान को सीधे और '<%-x%>' में भी विभाजित करता है- एचटीएमएल से बच निकलता है, इसलिए '<' and '>' जैसे वर्ण HTML पार्सर द्वारा नहीं खाए जाते हैं। – prototype

+1

जावास्क्रिप्ट टर्मिनल सेमीकॉलन में वैकल्पिक हैं, लेकिन शायद इसमें शामिल होना बेहतर है। – prototype

-1

सोचो वहाँ एक बेहतर तरीका है जब EJS को एक वस्तु गुजर, आप न JSON से निपटने के लिए। स्ट्रिंगफी और JSON.parse विधियों, वे थोड़ा मुश्किल और उलझन में हैं। इसके बजाय आप उदाहरण के लिए, अपने वस्तुओं की कुंजी यात्रा करने के लिए लूप में के लिए उपयोग कर सकते हैं:

आप इस तरह के पदानुक्रम

{ 
    "index": { 
     "url": "/", 
     "path_to_layout": "views/index.ejs", 
     "path_to_data": [ 
      "data/global.json", 
      { 
       "data/meta.json": "default" 
      } 
     ] 
    }, 
    "home": { 
     "url": "/home", 
     "path_to_layout": "views/home/index.ejs", 
     "path_to_data": [ 
      "data/global.json", 
      { 
       "data/meta.json": "home" 
      } 
     ] 
    }, 
    "about": { 
     "url": "/about", 
     "path_to_layout": "views/default.ejs", 
     "path_to_data": [ 
      "data/global.json", 
      { 
       "data/meta.json": "about" 
      } 
     ] 
    } 
} 

की तरह एक वस्तु EJS तरफ है, तो आप कर सकते हैं इस तरह पाश yourObject;

<% if (locals.yourObject) { %> 
    <% for(key in yourObject) { %> 
    <% if(yourObject.hasOwnProperty(key)) { %> 
     <div> <a class="pagelist" href="<%= yourObject[key]['subkey'] %>"><%= key %></a></div> 
    <% } %> 
    <% } %> 
<% } %> 

इस उदाहरण के लिए [कुंजी] मूल्यों 'के बारे में' 'सूचकांक', 'घर' और ले जा सकते हैं और उपकुंजी इसके बारे में किसी भी तरह के 'url', 'path_to_layout', 'path_to_data'

के रूप में बच्चों है हो सकता है
1

यदि आप templating का उपयोग कर रहे हैं, तो टेम्पलेट में मान प्राप्त करना बेहतर होगा, उदाहरण के लिए कि उपयोगकर्ता साइन इन है या नहीं।

<script> 
    window.user = <%- JSON.stringify(user || null) %> 
</script> 

सर्वर साइड कोड से, आप उपयोगकर्ता डेटा भेज रहे हैं, स्थानीय डेटा भेज सकते हैं।

res.render('profile', { 
    user: user.loggedin, 
    title: "Title of page" 
}); 
संबंधित मुद्दे