在Jade中使用变量

Spe*_*age 51 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'
  });
});
Run Code Online (Sandbox Code Playgroud)

layout.jade

- var templates = page + '/templates/'

include templates
Run Code Online (Sandbox Code Playgroud)

当我这样做时,我得到了错误 EBADF, Bad file descriptor 'templates.jade'

我甚至试过了

include #{templates}
Run Code Online (Sandbox Code Playgroud)

无济于事.

fre*_*ish 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
        });

    });

});
Run Code Online (Sandbox Code Playgroud)

layout.jade

|!{ html }
Run Code Online (Sandbox Code Playgroud)

  • 似乎两次调用render()可能会对性能产生负面影响. (2认同)
  • 这很糟糕,我们不应该为这样一个常见问题做一个详细的解决方法. (2认同)

ant*_*paw 19

这也有效:

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


//template
!= templateRender('my/path/'+dynamic+'.jade', options)
Run Code Online (Sandbox Code Playgroud)

这可能不会提高您使用"视图缓存"设置所期望的性能(默认情况下,它在NODE_ENV ==='production'中打开).甚至打破应用程序(例如,如果在部署新代码时文件在硬盘驱动器上不可用).在客户端或同构应用程序中尝试使用此技巧也无法正常工作,因为无法编译模板.


Fri*_*jol 7

找到这个页面谷歌搜索相同的问题,但在不同的背景下,所以我想我的解决方案(阅读:解决方法)在这里为后代:

我想用变量中的更多上下文来包围我的include,例如(简化):

- 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
Run Code Online (Sandbox Code Playgroud)

由于这不起作用(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
Run Code Online (Sandbox Code Playgroud)

我以前的回答:

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/

...
Run Code Online (Sandbox Code Playgroud)

它并不优雅,如果您需要以这种方式包含多个东西,它将无法工作,但至少部分Jade是动态的.