2015-05-26 14 views
8

Se sto usando Handlebars come il mio motore di template con Express 4, sembra che c'è solo la possibilità di specificare un modello di layout singolo da utilizzare per tutti i vostri punti di vista:Layout multipli con Handlebars e ExpressJS?

app.engine('hbs', expressHbs({extname:'hbs', defaultLayout:'layout.hbs'})); 

Cosa fare se la vostra applicazione necessita di più layout? Cosa succede se viewA.hbs utilizza un layout e viewB.hbs richiede un layout diverso?

Mentre sto imparando nodejs, vengo da uno sfondo PHP Laravel in cui lo Blade templating engine è stato specificato quale layout utilizzare nella parte superiore di ciascun file di visualizzazione. È davvero semplice passare da un modello di layout a una determinata vista.

risposta

28

Si dovrebbe essere in grado di passare il layout dal percorso/controller quando si chiama il metodo di rendering.

router.get('/', function(req, res) { 
    res.render('home', {layout: 'viewBLayout.hbs'}); 
}); 

Sono abbastanza sicuro giada vi permetterà di passare da un layout dall'interno del modello, ma non so se si può fare con il manubrio.

+0

Ah, mi sono perso totalmente nei documenti. Grazie! –

4

Se si utilizza express-hbs, è possibile specificare un layout nel modello con un commento del tipo:

{{!< layout}} 

In alternativa, si può provare exphbs. Supporta anche commenti di layout e più layout possono essere annidati. (Dichiarazione di non responsabilità: l'ho scritto.)

+1

Grazie. Domanda a parte: come mai ci sono così tante diverse implementazioni di manubri espressi? express-hbs, exphbs, expressHbs, ecc.? –

+0

Felice che hai chiesto. Non penso di essere qualificato per rispondere a questa domanda. Ma dalla mia esperienza personale, una comunità vivace è solitamente una buona cosa. :) – gnowoel

+3

L'unico svantaggio di questo è che il progetto A ha una grande idea n. 1 implementata e il progetto B ha una grande idea n. 2 implementata. Non puoi averli entrambi e sarebbe stato meglio se la gente avesse appena collaborato a un singolo progetto che contenesse entrambe le grandi idee. –