Как в Express.js я могу отобразить частичное представление Jade без объекта ответа?

Используя Express.js, я хотел бы отобразить частичное представление из шаблона Jade в переменную.

Обычно вы визуализируете частичное представление непосредственно в объекте ответа:

response.partial('templatePath', {a:1, b:2, c:3})

Однако, поскольку я нахожусь внутри события сервера Socket.io, у меня нет объекта «ответ».

Есть ли элегантный способ отобразить частичное представление Jade для переменной без использования объекта ответа?


person Lior Grossman    schedule 27.12.2011    source источник


Ответы (2)


Вы можете вручную скомпилировать шаблон Jade.

var jade = require('jade');
var template = require('fs').readFileSync(pathToTemplate, 'utf8');
var jadeFn = jade.compile(template, { filename: pathToTemplate, pretty: true });
var renderedTemplate = jadeFn({data: 1, hello: 'world'});
person staackuser2    schedule 27.12.2011
comment
Работает отлично, спасибо! Я использовал следующее для разрешения pathToTemplate: var pathToTemplate = require('path').resolve(__dirname, '../views') + templateName + '.jade'; - person Lior Grossman; 27.12.2011
comment
Большое тебе спасибо! У меня была эта проблема, пытаясь подогнать частичное, и ваш ответ был первым результатом в Google. Ты рок человек! - person Herman Junge; 30.06.2012
comment
Этот ответ правильный, но если вы хотите использовать механизм кэширования, проверьте ответ Матиаса - person fider; 21.01.2014
comment
Просто повторно используйте jadeFn (например, в цикле), и он будет использовать кешированный шаблон. - person staackuser2; 22.01.2014

Вот прямое решение этой проблемы для пользователей express 3 (которое теперь должно быть широко распространено):

res.partial() был удален, но вы всегда можете использовать app.render() с функцией обратного вызова, если объект ответа не является частью текущего контекста, как в случае Лиора:

app.render('templatePath', {
  a: 1,
  b: 2,
  c: 3
},function(err,html) {
  console.log('html',html);
  // your handling of the rendered html output goes here
});

Поскольку app.render() является функцией объекта экспресс-приложения, он, естественно, знает о настроенном механизме шаблонов и других настройках. Он ведет себя так же, как конкретный res.render() в app.get() или других событиях экспресс-запроса.

Смотрите также:

person matthias    schedule 04.10.2012
comment
Этот способ лучше из-за использования кеша? Я прав? @matthias поправьте меня, если я ошибаюсь ?? - person fider; 21.01.2014
comment
Насколько я помню, (скомпилированные) шаблоны Jade кэшируются в производственных средах (NODE_ENV=production), так что это правда. С другой стороны, с подходом @emostars для ручного чтения из fs и компиляции вы достаточно гибки, чтобы самостоятельно контролировать поведение кэширования, например. повторно использовать jadeFn без необходимости перечитывать или перекомпилировать исходную строку шаблона jade. - person matthias; 21.01.2014