我正在使用Jade和Express,我想在include语句中使用变量。例如:
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 :(得分:42)
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 }
答案 1 :(得分:19)
这也有效:
//controller
var jade = require('jade');
res.render('show', {templateRender: jade.renderFile});
//template
!= templateRender('my/path/'+dynamic+'.jade', options)
这可能不会提高您使用'view cache'设置所期望的性能(默认情况下,它在NODE_ENV =&#39; production&#39;中)。甚至打破应用程序(例如,如果在部署新代码时文件在硬盘驱动器上不可用)。在客户端或同构应用程序中尝试使用此技巧也无效,因为无法编译模板。
答案 2 :(得分:6)
发现此页面搜索同一个问题,但在不同的背景下,所以我想把我的解决方案(阅读:解决方法)放在这里为后代:
我希望用更多来自变量的上下文来包围我的包含,例如(简化的):
- 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
由于这不起作用(Jade并不支持动态包含,如怪异所指出的),我与mixin杂交:
(编辑 - 比我以前的解决方案更优雅一点:)
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/
...
它并不优雅,如果你需要以这种方式包含更多东西,它就不会起作用,但至少部分玉石是动态的。
答案 3 :(得分:1)
为什么不使用jade继承?
在中间件级别呈现您想要的内容:
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
答案 4 :(得分:0)
现在是2019年,在Pug(以前是Jade)mixin中使用变量变得很简单。
在创建混入时,您可以根据期望传递给混入的值为其提供参数。您可以使用点表示法访问任何嵌套值。
mixinFile.pug:
mixin myMixin(parameter1, parameter2, parameter3)
h2.MyHeading #{parameter1}
p.MyParagraph #{parameter2.myVariable}
.MyBox(id= parameter3.id)
index.pug:
include mixinFile
block content
+MyMixin(variable1, variable2, variable3)
您可以在official Pug documentation on Mixins中阅读更多内容。