2011-09-02 11 views
27

ईजेएस टेम्पलेट में एक अपरिभाषित संपत्ति की जांच करने का सबसे अच्छा तरीका क्या है?आप node.js के लिए ejs में अपरिभाषित संपत्ति की जांच कैसे करेंगे?

(मैं टीजे Holowaychuk द्वारा node.js package उपयोग कर रहा हूँ)

उदाहरण:

var tpl = '<% if (foo) { %>foo defined<% } else { %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz" } })); 

मैं इस प्रस्तुत करने के लिए "foo अपरिभाषित" उम्मीद थी। यह इसके बजाय foo अपरिभाषित त्रुटि फेंक देता है।

मुझे पता है कि यह एक मुद्दा नहीं माना जाता है, क्योंकि यह व्यवहार in the tests से अपेक्षित है। क्या इससे बचने का कोई आसान तरीका है?

मुझे मिला एकमात्र समाधान hasOwnProperty विधि का उपयोग कर रहा है।

var tpl = '<% if (hasOwnProperty("foo")) { %>foo defined<% } else { %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz"} })); 

यह किसी भी त्रुटि को फेंक नहीं देता है।

क्या टेम्पलेट को साफ रखने का कोई बेहतर तरीका है? या यह इस त्रुटि को क्यों फेंक देता है?

उत्तर

49

एक और तरीका है एक संपत्ति के लिए परीक्षण करने के लिए locals वस्तु के माध्यम से परोक्ष रूप से यह संदर्भ के लिए है:

यह भी एक त्रिगुट है, जो "स्वच्छ" curlies के अभाव के कारण के रूप में कुछ दृश्य के रूप में व्यक्त किया जा सकता । मेरी राय में

var tpl = '<% if(locals.foo){ %>foo defined<% }else{ %>foo undefined<% } %>'; 
console.log(ejs.render(tpl, { locals: { bar: "baz"} })); 
+0

यह वही है जो मैं चाहता था। :) – pvorb

+6

बस मुझे क्या चाहिए, लेकिन wtf, आपको ऐसा क्यों करना है ?! :) –

+0

स्रोत की जांच किए बिना सुनिश्चित नहीं है, लेकिन मुझे संदेह है कि टेम्पलेट इंजन अपरिभाषित मानों के लिए चर के चरम पर परेशान नहीं है। प्रतीत होता है कि –

15

मैं typeof का उपयोग करता हूं, जैसा कि if (typeof foo == 'undefined') में है। मैं स्ट्रिंग "अपरिभाषित" स्ट्रिंग के साथ typeof ऑपरेटर का उपयोग करता हूं, जबकि कुछ लोग undefined वैश्विक चर के साथ सीधी तुलना कर सकते हैं। मैं इस विधि को प्राथमिकता देता हूं क्योंकि यह कुछ आतंकवादी जेएस लाइब्रेरी डेवलपर के खिलाफ संरक्षित है जो वैश्विक चर के मूल्य को बदल रहा है, जिससे आपका कोड टूटा हुआ है।

var tpl = '<% (typeof foo != "undefined" ? %>foo defined<% : %>foo undefined<%) %>'; 
+1

यह काम करता है और शायद यह औपचारिक रूप से सही है। लेकिन मुझे व्यक्तिगत रूप से यह पसंद नहीं है, क्योंकि यह मेरे टेम्पलेट्स के लिए बहुत लंबा है। – pvorb

+1

ध्यान दें कि यह एकमात्र तरीका है जो क्लाइंट साइड ईजेएस टेम्पलेट्स के साथ काम करेगा। अन्य विधियां 'res' ऑब्जेक्ट को चेक करने पर भरोसा करती हैं जो क्लाइंट साइड टेम्पलेट्स के साथ मौजूद नहीं होगी। – dbasch

9

सरल, और साफ: अपने उदाहरण का उपयोग

<%= (!!locals.foo)?foo:'' %>

+3

स्थानीय ईजे संस्करणों में रेस ऑब्जेक्ट में स्थानांतरित हो गए हैं। – dbasch

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