Способ работы помощников в Handlebars немного сложен. Вместо того, чтобы передавать данные из помощника в тело основного шаблона, вы передаете часть тела шаблона, связанную с помощником, помощнику.
Итак, например, когда вы делаете это:
{{#entries this}}
<a href="/{{slug}}">{{title}}</a>
{{/entries}}
Вы предоставляете помощнику entries
две вещи: 1) текущий контекст (этот) 2) некоторую логику шаблона для применения
Вот как помощник получает эти элементы:
Handlebars.registerHelper('entries', (data, options) => {
// data is whatever was provided as a parameter from caller
// options is an object provided by handlebars that includes a function 'fn'
// that we can invoke to apply the template enclosed between
// #entries and /entries from the main template
:
:
});
Итак, чтобы сделать то, что вы хотите сделать:
Handlebars.registerHelper('testHelper', (ignore, opt) => {
var data = [
{ slug: 'Test', title: 'This is it!' },
{ slug: 'Test 2', title: 'This is the second it!' },
];
var results = '';
data.forEach( (item) => {
results += opt.fn(item);
});
return results;
});
opt.fn(item)
применяет эту часть шаблона:
<a href="/{{slug}}">{{title}}</a>
и идея состоит в том, чтобы создать строку (часть вашего html), которая затем возвращается и помещается в строку, сформулированную вашим основным шаблоном.
Вот пример, чтобы показать, как это работает.
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/2.0.0/handlebars.js"></script>
</head>
<body>
<script id="t" type="text/x-handlebars">
{{#testHelper this}}
<a href="/{{slug}}">{{title}}</a>
{{/testHelper}}
</script>
<script>
Handlebars.registerHelper('testHelper', (ignore, opt) => {
var data = [
{ slug: 'Test', title: 'This is it!' },
{ slug: 'Test 2', title: 'This is the second it!' },
];
var results = '';
data.forEach((item) => {
results += opt.fn(item);
});
return results;
});
var t = Handlebars.compile($('#t').html());
$('body').append(t({}));
</script>
</body>
</html>
Позвольте мне также повторить то, что другие пытались вам сказать. Нет особого смысла пытаться заполнить данные в ваших шаблонах. Это должно быть передано в качестве контекста для ваших шаблонов. В противном случае вы смешиваете свою бизнес-логику с логикой шаблона (представление), и это излишне усложняет ситуацию.
Вот простое изменение, которое вы можете внести в тот же фрагмент, передав данные в свои шаблоны:
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/handlebars.js/2.0.0/handlebars.js"></script>
</head>
<body>
<script id="t" type="text/x-handlebars">
{{#testHelper this}}
<a href="/{{slug}}">{{title}}</a>
{{/testHelper}}
</script>
<script>
Handlebars.registerHelper('testHelper', (ignore, opt) => {
var results = '';
data.forEach((item) => {
results += opt.fn(item);
});
return results;
});
var data = [
{ slug: 'Test', title: 'This is it!' },
{ slug: 'Test 2', title: 'This is the second it!' },
];
var t = Handlebars.compile($('#t').html());
$('body').append(t(data));
</script>
</body>
</html>
Таким образом, вы можете получить свои данные в своем javascript и сохранить шаблоны для того, для чего они были предназначены - формулировка html.
person
rasmeister
schedule
19.02.2017