2011-12-27 16 views
12

Utilizzando Express.js, mi piacerebbe rendere una vista parziale da un modello Jade a una variabile.In Express.js, come posso eseguire il rendering di una vista parziale Jade senza un oggetto "risposta"?

Di solito, è il rendering di una parziale vista direttamente all'oggetto risposta:

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

Tuttavia, dato che sono all'interno di un evento del server Socket.io, non ho l'oggetto "risposta".

Esiste un modo elegante per eseguire il rendering di una vista parziale Jade su una variabile senza utilizzando l'oggetto risposta?

risposta

13

È possibile compilare manualmente il modello di giada.

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

funziona perfettamente, grazie! Per risolvere pathToTemplate ho utilizzato quanto segue: var pathToTemplate = require ('percorso'). Resolve (__ dirname, '../views') + templateName + '.jade'; –

+1

Grazie mille! Ho avuto questo problema cercando di adattare un partial e la tua risposta è stata il primo risultato su google. Sei un uomo rock! –

+0

Questa risposta è corretta ** ma se si desidera utilizzare il meccanismo di cache ** controllare [risposta 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

Ecco la soluzione direttamente a questo problema per Express 3 utenti (che dovrebbero essere ampiamente diffuse oggi):

res.partial() è stato rimosso, ma si può sempre utilizzare app.render() utilizzando la funzione di callback, se l'oggetto risposta non è parte del contesto attuale come nel 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 
}); 

Da app.render() è una funzione della applicazione obiet espresso t è naturalmente a conoscenza del motore di template configurato e di altre impostazioni. Si comporta allo stesso modo dello specifico res.render() su app.get() o altri eventi di richiesta espressa.

Consulta anche:

+0

In questo modo è meglio usare la cache? A ho ragione? @matthias ** correggimi se sbaglio ** ?? – fider

+0

Per quanto mi ricordo, i template di giada (compilati) sono memorizzati nella cache in ambienti di produzione (NODE_ENV = "production"), quindi è vero. D'altra parte, con l'approccio manuale @emostars read-from-fs-and-compile sei abbastanza flessibile da controllare te stesso il comportamento di caching, ad es. riutilizzare '' 'jadeFn''' senza la necessità di rileggere o ricompilare la stringa del modello di giada originale. – matthias

Problemi correlati