2012-06-14 89 views
10

我想讓我的Jade頁面根據條件擴展不同的佈局。所以我的代碼如下所示:nodejs玉有條件擴展

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

現在這不起作用。無論條件如何,似乎只有最後定義的擴展才會受到尊重。我也試過動態定義TEMPLATENAME,如

extends myLayoutNameVariable 

,並設置以不同的方式myLayoutNameVariable(表達動態輔助函數,將其設置爲VAR,局部變量等)

是否有任何其他解決方案的條件佈局或有人可以告訴我我做錯了什麼?

乾杯,西蒙

+0

你的意思是' - 如果myConditionVariable' - 看到'if前面的減號'嗎? (對於'else'分支也是如此。)另外,你可能是指'append block'或其他東西。 – elmigranto

回答

7

這似乎是一個問題,仍然在github上打開。

+0

感謝您的提示!顯然,對於包含也是如此,因爲佈局和包含在編譯時解析,而不是運行時解析。 – cmonsqpr

0

你可以這樣做:

if myConditionVariable 
    p test 

如果不是,當您告訴渲染該視圖時,您是否正確地通過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的普通視圖無需修改就可以工作(這個jade模板包含兩種情況)。

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

這是否會影響性能?當我看到上面鏈接的github上的問題時,似乎TJ表示Express不會緩存頁面。對不起,從死亡中提出一個老問題。 – mshindal

+1

@mshindal - 我不知道如何回答你的問題,這其實有很多部分:1)JADE編譯與以前一樣,所以更多的模板代碼,但不是真正的巨大影響。 2)取決於如何配置緩存,如果您使用的是ETag,則需要在生成etag時考慮此頭,但說實話,我認爲這個解決方案與緩存問題是正交的。所以..我的答案是「不,它不會影響性能」 –

+0

只是你知道,表示暴露'req.xhr',它檢查你的'x-requested-with'標題;) – Chev

3

我希望這不是爲時已晚,但我碰到這個問題跑,我想我想出了一個解決辦法:

  1. 做一個layout.jade是conditionaly包括佈局:

    layout.jade: 
    
    if conditionalVariable 
        include firstLayout.jade 
    else 
        include otherLayout 
    
  2. 在您的看法中,在控制器中擴展layout.jade並定義conditionalVariabletrue/false):

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

+0

延伸如何,我試圖擴展firstLayout,但它沒有工作 –