2012-06-14 21 views
10

मैं अपने जेड पेज विभिन्न लेआउट का विस्तार, एक स्थिति के आधार पर बनाने के लिए करना चाहते हैं। तो मेरा कोड इस तरह दिखता है:NodeJS जेड सशर्त विस्तार

if myConditionVariable 
    extends layout1 
else 
    extends layout2 
block content 
    p here goes my content! 

अब यह काम नहीं करता है। ऐसा लगता है केवल पिछले परिभाषित फैली रूप में अगर ध्यान रखा जाएगा, स्थिति की परवाह किए बिना। मैं भी इस तरह के रूप

extends myLayoutNameVariable 

और-अलग तरह से myLayoutNameVariable सेट TEMPLATENAME को परिभाषित करने, गतिशील रूप से करने की कोशिश की (गतिशील सहायक समारोह व्यक्त करते हैं, वर, स्थानीय वर आदि के रूप में सेट ...)

क्या कोई अन्य है सशर्त लेआउट के लिए समाधान या कोई मुझे बता सकते हैं मैं गलत क्या कर रहा हूँ?

if myConditionVariable 
    p test 

:

चीयर्स, साइमन

+0

क्या आपका मतलब था '- अगर मेरा कंडीशनिंग योग्य' - उस 'शून्य' के सामने शून्य देखें? ('Else' शाखा के लिए भी।) इसके अलावा, आप शायद 'ब्लॉक संलग्न करें' या कुछ मतलब है। – elmigranto

उत्तर

7

यह एक मुद्दा अभी भी github पर खुली हुई है कि हो रहा है।

+0

धन्यवाद! स्पष्ट रूप से वही शामिल है, क्योंकि लेआउट और शामिल संकलन समय में हल हो जाते हैं, रनटाइम नहीं। – cmonsqpr

0

आप की तरह कुछ कर सकता हूँ?

यदि नहीं, तो आप myConditionVariable सही पारित जब आप उस दृश्य प्रस्तुत करने के लिए बता सकते हैं? इस के लिए एक छोटी उदाहरण:

app.get "/", (req, res) -> 
    res.render "index", 
    myConditionVariable: true 
+0

वह इसे सही ढंग से पारित कर रहा है। यदि नहीं, तो 'myConditionVariable परिभाषित नहीं किया गया' कहने में त्रुटि होगी। संकेत के लिए – elmigranto

11

तो, यह से निपटने के लिए एक से थोड़ा कम दखल तरह से लेआउट में परिवर्तन करने की है।

मैं मिडलवेयर का एक सा जोड़ा है, और बाकी बहती है ..

app.use(function(req, res, next){ 
    res.locals.isAjax = req.headers['x-requested-with'] && 
     req.headers['x-requested-with'] === 'XMLHttpRequest'; 
    next(); 
}); 

अब जब कि इस सेट किया गया है, "isAjax" जेड के लिए उपलब्ध है।

मेरी "layout.jade" में (आप से का विस्तार होगा टेम्पलेट), मैं यह कर:

- if(!isAjax) 
    doctype 5 
    html 
     head 
     body 
     block content 
     block scripts 
- else 
    block content 
    block scripts 

मैं के लिए पूर्ण layout.jade के अन्य तत्वों के बाहर छीन लिया है (उम्मीद) स्पष्टता।

अंत में, मेरे सामान्य विचारों कि संशोधन के बिना layout.jade काम का विस्तार (इस जेड टेम्पलेट दोनों ही मामलों में शामिल हैं)।

extends layout.jade 
    .container. 
    This is text will be wrapped for a non-ajax request, 
    but not for an ajax request. 
+0

क्या यह प्रदर्शन को प्रभावित करता है? जब मैंने उपरोक्त लिंक गिटब पर इस मुद्दे को देखा तो ऐसा लगता था कि टीजे ने कहा था कि एक्सप्रेस पृष्ठों को कैश नहीं करेगा। मृतकों से एक पुराना सवाल उठाने के लिए खेद है। – mshindal

+1

@mshindal - मुझे यकीन नहीं है कि आपके प्रश्न का उत्तर कैसे दिया जाए, इसके लिए वास्तव में कई भाग हैं: 1) जेएडीई संकलन पहले जैसा ही होता है, इतना अधिक टेम्पलेट कोड, लेकिन वास्तव में एक बड़ा प्रभाव नहीं है। 2) कैशिंग कॉन्फ़िगर किया गया है, इस पर निर्भर करता है कि यदि आप ईटैग का उपयोग कर रहे हैं, तो आपको इस हेडर के लिए एटैग उत्पन्न करने के लिए खाते की आवश्यकता होगी, लेकिन ईमानदारी से, मुझे लगता है कि यह समाधान चिंताओं को कैश करने के लिए ऑर्थोगोनल है। तो .. मेरा जवाब "नहीं, यह प्रदर्शन को प्रभावित नहीं करेगा" –

+0

बस इतना ही पता है, एक्सप्रेस 'req.xhr' का खुलासा करता है जो आपके लिए' x-request-with 'शीर्षलेख की जांच करता है;) – Chev

3

मुझे आशा है कि यह बहुत देर नहीं हुई, लेकिन मैं इस मुद्दे को भर में भाग गया और मुझे लगता है कि मैं एक वैकल्पिक हल पता लगा:

layout.jade: 

if conditionalVariable 
    include firstLayout.jade 
else 
    include otherLayout 
:

  1. एक layout.jade कि conditionaly दोनों लेआउट शामिल है

  2. अपने विचार में, layout.jade का विस्तार करें, और नियंत्रक में conditionalVariable परिभाषित करें (true/false):

    view.jade: 
    
    extends layout 
    
    block content 
        p here goes my content! 
    
  3. Disco!

+0

विस्तार के बारे में क्या, मैंने पहली बार विस्तार करने की कोशिश की लेकिन यह काम नहीं किया –