2011-12-27 41 views
12

Usando Express.js, me gustaría hacer una vista parcial desde una plantilla de Jade a una variable.En Express.js, ¿cómo puedo renderizar una vista parcial de Jade sin un objeto de "respuesta"?

Por lo general, hacer una vista parcial directamente al objeto respuesta:

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

Sin embargo, ya que estoy dentro de un evento de servidor Socket.io, no tengo el objeto "respuesta".

¿Existe una forma elegante de presentar una vista parcial de Jade a una variable sin utilizando el objeto de respuesta?

Respuesta

13

Puede compilar manualmente la plantilla de 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'}); 
+2

funciona perfectamente, gracias! Usé lo siguiente para resolver pathToTemplate: var pathToTemplate = require ('ruta'). Resolve (__ dirname, '../views') + templateName + '.jade'; –

+1

¡Muchas gracias! Tuve este problema intentando ajustar un parcial, y tu respuesta fue el primer resultado en google. ¡Eres un hombre Rock! –

+0

Esta respuesta es correcta ** pero si desea utilizar el mecanismo de caché **, compruebe [respuesta de matthias] (http://stackoverflow.com/questions/8644580/in-express-js-how-can-i-render-a -jade-partial-view-without-a-response-object # answer-12725703) – fider

13

Aquí está la solución directamente a este problema para Express 3 usuarios (que debe ser ampliamente difundida de ahora):

res.partial() ha sido quitada pero siempre se puede utilizar app.render() usando la función de devolución de llamada, si el objeto de respuesta no es parte del contexto actual como en el caso Liors:

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 
}); 

Desde app.render() es una función de la objec aplicación expresa t es consciente naturalmente del motor de plantillas configurado y otras configuraciones. Se comporta de la misma manera que el res.render() específico en app.get() u otros eventos de solicitud expresa.

Consulte también:

+0

¿De esta manera es mejor debido al uso de caché? A ¿verdad? @matthias ** corrígeme si me equivoco ** ?? – fider

+0

Por lo que recuerdo, las plantillas de jade (compiladas) se almacenan en caché en entornos de producción (NODE_ENV = "producción"), así que eso es cierto. Por otro lado, con el enfoque manual de @emostars de leer y sacar compilaciones usted es lo suficientemente flexible como para controlar el comportamiento de almacenamiento en caché usted mismo, p. reutilice '' 'jadeFn''' sin la necesidad de volver a leer o volver a compilar la cadena de plantilla de jade original. – matthias

Cuestiones relacionadas