Использовать переменную в 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}
безрезультатно.
Ответы
Ответ 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