2012-08-26 52 views
47

我正在使用Jade和Express,我想在我的include語句中使用一個變量。例如:在Jade中使用變量包括

app.js

app.get('/admin', function (req, res) { 
    var Admin = require('./routes/admin/app').Admin; 

    res.render(Admin.view, { 
    title: 'Admin', 
    page: 'admin' 
    }); 
}); 

layout.jade

- var templates = page + '/templates/' 

include templates 

當我這樣做,我得到EBADF, Bad file descriptor 'templates.jade'

我甚至嘗試

include #{templates} 

錯誤無濟於事。

+0

我一直在尋找這個問題,以及。驚訝這個功能尚未添加。分叉回購看看實現這個功能是多麼困難。 –

回答

41

AFAIK JADE不支持動態包括。我的建議是 「包括」 模板外,即

app.js

app.get('/admin', function (req, res) { 
    var Admin = require('./routes/admin/app').Admin; 
    var page = 'admin'; 

    var templates = page + '/templates/'; 

    // render template and store the result in html variable 
    res.render(templates, function(err, html) { 

     res.render(Admin.view, { 
      title: 'Admin', 
      page: page, 
      html: html 
     }); 

    }); 

}); 

layout.jade

|!{ html } 
+0

也適用。謝謝! –

+2

看起來好像兩次調用render()可能會對性能產生負面影響。 –

+0

@StephenDavis是的,但我懷疑它永遠不會是一個問題(數據庫始終是一個瓶頸)。 – freakish

6

找到了這個網頁google搜索同樣的問題,但在不同的背景下,所以我想我的解決方案(閱讀:解決方法)在這裏爲後人:

我想圍繞包含更多從變量拉取的上下文,例如(簡化):

- var templates = page + '/templates/' 
- var headid = page + 'head' 
- var imgsrc = '/images/' + page 
div(id=headid)  
    h1 #{page} 
    img(src=imgsrc) 
div(id=page) 
    include templates 

由於不工作(玉不支持動態包括,如由畸形說明),我雜交用一個混合:

(編輯 - 稍比更優雅我以前的解決方法:)

mixin page1 
    include page1/templates 

mixin page2 
    include page2/templates 

... 

- for (var i = 0; i < 3; i++) 
    - var page = 'page' + i 
    - var headid = page + 'head' 
    - var imgsrc = '/images/' + page 
    div(id=headid)  
    h1 #{page} 
    img(src=imgsrc) 
    div(id=page) 
    +page 

我以前的答案:

mixin templates(page) 
    - var headid = page + 'head' 
    - var imgsrc = '/images/' + page 
    div(id=headid)  
    h1 #{page} 
    img(src=imgsrc) 

+templates('page1') 
#page1 
    include page1/templates/ 

+templates('page2') 
#page2 
    include page2/templates/ 

... 

這不是優雅,也不會w ^如果你需要用這種方式包含更多的東西,但是至少部分Jade是動態的。

19

這也適用:

//controller 
var jade = require('jade'); 
res.render('show', {templateRender: jade.renderFile}); 


//template 
!= templateRender('my/path/'+dynamic+'.jade', options) 

這可能不會增加,你會期望從使用'view cache'設置(默認情況下它在NODE_ENV ===「生產」是上)的性能。甚至會破壞應用程序(例如,如果在部署新代碼時文件在硬盤上不可用)。也試圖在客戶端或同構應用程序中使用此技巧將無法正常工作,因爲無法編譯模板。

+1

這真是太棒了 –

+1

但不是用'context'調用函數,它應該是'locals' –

+0

http://jade-lang.com/api/一個選項對象,也用作本地對象。這是兩個。 – antpaw

1

爲什麼不使用玉遺傳?

渲染你想在中間件層面的內容:

res.render('templates/' + template_name + '.jade') 

寫常見common.jade

h1 This is a page 
.container 
    block sublevel 
    h2 Default content 

然後寫一個擴展common.jade文件:

extends common.jade 
block sublevel 
    h2 Some things are here