Здравствуйте, я работаю через ' Веб-разработка с Node и Express' Этана Брауна. В книге, которая работает с шаблонами Handlebars, я нашел следующий код:
app.engine('handlebars', expressHandlebars({
defaultLayout: 'main',
helpers: {
section: function(name, options) {
if(!this._sections) this._sections = {}
this._sections[name] = options.fn(this)
},
}
}));
main.handlebars:
<!doctype html>
<html>
<head>
{{{_sections.title}}}
<link rel="stylesheet" href="css/main.css">
</head>
<body>
<header>
<img id= "header-logo" src="/img/logo.jpg">
</header>
{{{body}}}
</body>
</html>
view.handlebars:
{{#section 'title'}}
<title>Lore Ipsmum</title>
{{/section}}
<h1>Lore Ipsum</h1>
<p>Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor</p>
У меня есть два вопроса по этому поводу:
- Насколько я понимаю, вспомогательная функция вызывается с
this
как контекст встраивания и, следовательно, используется для использовать содержимое {{#section 'title'}}
-Block в view.handlebars для контекста, в котором отображается макет main.handlebars . Я до сих пор не до конца понимаю, почему options.fn(this)
возвращает литералы в {{#section 'title'}}
в виде строки. - Это, очевидно, своего рода хакерское решение; принимая во внимание, насколько полезно и удобно иметь возможность объявлять несколько вещей в одном представлении, которые не обязательно должны отображаться согласованно на результирующей визуализированной странице, я предполагаю, что есть веская причина, почему нет более простого способа сделать это / почему это не функция по умолчанию?