2011-10-02 10 views
11

Esiste un modo per eseguire il rendering di un modello su una variabile invece di eseguire l'output?Render modello a variabile in expressjs

res.render('list.ejs', { 
    posts: posts 
}); 

qualcosa di simile

var list = render('list.ejs', { 
    posts: posts 
}); 

risposta

22

Il modo più semplice per farlo è quello di passare un callback a res.render, nel tuo esempio:

res.render('list.ejs', {posts: posts}, function(err, list){ 
    // 
}); 

Ma se si vuole rendere i modelli parziali al fine di includerli in un altro modello che sicuramente dovrebbe avere un guarda view partials.

+1

ho bisogno di caricare parziale da ajax in risposta JSON – xrado

+1

così funziona? Non voglio rendere effettivamente una pagina indietro all'utente, voglio includere la stringa renderizzata in una risposta res.json(). – chovy

+0

Sì, questo funziona. Il callback predefinito, che è quello che avrebbe restituito la pagina all'utente, non viene chiamato quando si passa il proprio. –

2

Io sono piuttosto un novizio su express.js, in ogni caso io non sono sicuro che si può accedere alla stringa reso in quel modo, ma se si guarda al Express' "vista .js "source su github (here) si vede che sta accettando un callback come secondo argomento, se questo può essere d'aiuto: si può accedere alla stringa renderizzata lì.

Altrimenti, penso che sia abbastanza facile applicare il codice per aggiungere un metodo che restituisce la stringa renderizzata senza inviarlo: on line #399 si ha la stessa chiamata che fornisce la stringa che si sta cercando.

1

Questa non era la domanda originariamente richiesta, ma sulla base dei commenti dell'OP e di altri, sembra che l'obiettivo sia quello di rendere un partial tramite json (jsonp), che è qualcosa che dovevo fare.

E 'abbastanza facile:

app.get('/header', function (req, res) 
{ 
    res.render('partials/header', { session: req.session, layout: null }, function (err, output) 
    { 
     res.jsonp({ html: output }); 
    });  
}); 

Nota: Nel mio caso, l'intestazione parziale richiesto la sessione, e la mia libreria di template (esprimere-hbs) necessaria layout: null per rendere il parziale senza utilizzare il layout predefinito.

È quindi possibile chiamare questo codice dal codice JavaScript nel client come qualsiasi altro endpoint JSONP.