Inicjalizacja silnika szablonów
const express = require('express') const expressHandlebars = require('express-handlebars') app.engine('handlebars', expressHandlebars({ defaultLayout: 'main', extname: '.hbs' })) app.set('view engine', 'handlebars') app.set('view cache', true) // def. ON prod / OFF dev mode const port = process.env.PORT || 3000 app.use( express.static(__dirname + "/public") )
Layout domyślny /views/layauts/main.handlebars (.hbs)
Przesłanie zmiennej do szablonu /views/about.handlebars (.hbs)
app.get('/about', (req, res) => { res.render('about', { name : fortune.getName(), // przesłanie zmiennej age : '<b>25</b> years', // przesłanie kodu HTML layout : null, // bez layout'u layout : 'my_layout' // własny layout }) })
Szablon /views/about.handlebars
<p>Nazywam się {{name}} mam {{{age}}}</p> - potrójne klamry nie zamieniają HTML na encje {{! Komentarz}}
// Obiekt kontekstu przekazany do szablonu
{
currency: {
name: 'United States dollars',
abbrev: 'USD',
},
tours: [
{ name: 'Hood River', price: '$99.95' },
{ name: 'Oregon Coast', price: '$159.95' },
],
specialsUrl: '/january-specials',
currencies: [ 'USD', 'GBP', 'BTC' ],
}
<ul>
{{#each tours}}
{{! I'm in a new block...and the context has changed }}
<li>{{name}} - {{price}}
{{#if ../currencies}}
({{../currency.abbrev}})
{{/if}}
</li>
{{/each}}
</ul>
{{#unless currencies}}
<p>All prices in {{currency.name}}.</p>
{{/unless}}
{{#if specialsUrl}}
{{! I'm in a new block...but the context hasn't changed (sortof) }}
<p>Check out our <a href="{{specialsUrl}}">specials!</p>
{{else}}
<p>Please check back often for specials.</p>
{{/if}}
<p>
{{#each currencies}}
<a href="#" class="currency">{{.}}</a>
{{else}}
Unfortunately, we currently only accept {{currency.name}}.
{{/each}}
</p>
{{../xxxx}} - dostęp do kontekstu nadrzędnego {{.}} - aktualny kontekst (tu zawartość tekstowa z tablicy) unless - przeciwny #if - gdy warunek nieprawdziwy