在Jade中使用变量

时间:2012-08-26 18:58:12

标签: node.js express pug

我正在使用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}

无济于事。

5 个答案:

答案 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中阅读更多内容。