2011-01-28 11 views
5

Sto usando express in nodejs e sto cercando di mantenere asciutto il rendering della mia vista. Dentro il mio layout, ho qualcosa di simile alla seguente (sto usando giada)DRY up up locals di layout nel rendering expressjs

body 
    nav.login 
    -if(currentUser) 
     ="logged in information" 
    -else 
     ="logged out information" 
    !=body 

Il problema è che ogni volta che mi rendo, sto ora tenuti ad avere

res.render('anything.jade',{ 
    locals: { 
    currentUser: req.session.currentUser, 
    /*all of my other locals*/ 
    } 
}); 

Sembra un dolore dover passare attraverso tutte le mie chiamate di rendering e aggiungerlo, e poi fare la stessa cosa se devo aggiungere altri locali al layout. C'è un modo per evitare di dover ridigitare 'currentUser' nella gente del posto ovunque io renderizzo

risposta

9

So che questa risposta è in ritardo, ma per i posteri: se stai usando express, dovresti usare gli helper dinamici forniti, che sono funzioni helper accessibili alla vista che prendono come argomento gli argomenti req,res. Nel tuo caso:

app.dynamicHelpers({ 
    user: function(req, res){ 
    return req.session.currentUser; 
    } 
}); 

che significa che la vista potrebbe ora chiamare #{user}

+0

Questo appare come una risposta migliore del mio; Non sono sicuro del modo in cui gli helper integrati erano in Express quando ho chiesto per la prima volta la domanda, anche se – Ryan

+0

Questo è un ottimo consiglio. Ho passato l'oggetto "sito" a ogni chiamata di render(). Grazie! –

0

La soluzione più semplice sarebbe quella di utilizzare una funzione che restituisce un oggetto locale.

function(req) { 
    return { 
     currentUser: req.session.currentUser, 
     /*all of my other locals*/ 
    }; 
} 

res.render('anything.jade',{ 
    locals: defaultLocals(req) 
}); 
2

ho finito per fare il seguente:

prima, ho creato alcune variabili locali

app.use(function(req,res,next){ 
    req.localvars = new Object; 
    next(); 
}); 

più tardi, ho impostare alcune variabili locali

app.use(function(req,res,next){ 
    req.localvars.currentUser = req.session.currentUser; 
    next(); 
}); 

ho creato a render function

function renderer(file){ 
    return function(req,res,next){ 
    res.render(file,{locals:req.localvars}); 
    } 
} 

poi per la funzione di routing

app.get('/',blah,blah,whatever,setSomeMoreLocalsHere,renderer(index.jade)); 

Ci potrebbe essere qualcosa di meglio, ma è la soluzione migliore che ho capito finora