2012-08-26 49 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