Подтвердить что ты не робот

Использовать переменную в Jade include

Я работаю с 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}

безрезультатно.

4b9b3361

Ответ 1

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 }

Ответ 2

это также работает:

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


//template
!= templateRender('my/path/'+dynamic+'.jade', options)

Это, вероятно, не увеличит производительность, которую вы ожидаете от использования параметра 'view cache' (по умолчанию он указан в NODE_ENV == = 'production'). Или даже сломать приложение (например, если файлы не доступны на жестком диске при развертывании нового кода). Также попытка использовать этот трюк на стороне клиента или изоморфное приложение не будет работать, потому что шаблон не может быть скомпилирован.

Ответ 3

Нашел эту страницу для поиска по одному и тому же вопросу, но в другом контексте, поэтому я подумал, что для потомства мое решение (читайте: обходное решение):

Я хотел бы окружить мое включение большим контекстом, вытащенным из переменной, например. (Упрощенный):

- 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:

(Edit - немного более элегантный, чем мой предыдущий обходной путь:)

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/

...

Это не изящно, и это не сработает, если вам нужно включить более чем несколько вещей таким образом, но по крайней мере часть Jade динамична.

Ответ 4

Почему не использовать наследование нефрита?

Отметьте, что вы хотите на уровне промежуточного программного обеспечения:

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