Вызов помощника внутри блока If в шаблоне Handlebars
Я работаю с Handlebars.JS template engine и я пытаюсь выяснить, как сделать что-то вроде этого (надуманный пример):
{{#if itemSelected "SomeItem"}}
<div>This was selected</div>
{{/if}
здесь itemSelected
является зарегистрированным помощником, как это:
Handlebars.registerHelper("itemSelected", function(item) {
var selected = false;
// Lots of logic that determines if item is selected
return selected;
});
Я получаю ошибки при попытке использовать этот синтаксис для шаблонов, и я не могу найти ни одного примера такого рода вещи. Я вижу простые # if блоки, подобные этому...
{{#if myValueInContext}}
<div>This will show if myValueInContext results in a truthy value.</div>
{{/if}}
но я не могу понять, как справиться с первым примером. Может, и так. подходить к этому неправильно.
кстати, я пометил эти усы, поскольку я не мог добавить тег руля к вопросу.
4 ответов
Я не думаю, что это сработает. Если я правильно понимаю документацию по рулю, #if является зарегистрированным помощником блока и не принимает другого зарегистрированного помощника в качестве аргумента.
в соответствии с документацией вы можете реализовать это так
Handlebars.registerHelper('ifItemSelected', function(item, block) {
var selected = false;
// lots of logic that determines if item is selected
if(selected) {
return block(this);
}
});
затем вы должны быть в состоянии вызвать его с
{{#ifItemSelected SomeItem}}
This was selected
{{/ifItemSelected}
но вы должны убедиться, что SomeItem имеет правильный формат. Я не вижу способа использовать зарегистрированный обработчик как условный в if-операторе.
вы должны добавить скобки вокруг вложенного вызова помощника:
{{#if (itemSelected "SomeItem")}}
<div>This was selected</div>
{{/if}
Я провел эксперименты и проверил, что он просто работает.
Не уверен, что это упоминается в документации по рулю. Я научился этому трюку на примерах руль-макетов.
С последней версии (1.0.дистанционное управление.1) руля, вы должны написать sth, как:
Handlebars.registerHelper('ifItemSelected', function(item, options) {
var selected = false;
// lots of logic that determines if item is selected
if (selected) {
return options.fn(this);
}
});
ie. заблокировать(это) заменить на параметры.fn (this)
Если вы хотите иметь еще вариант тоже, вам понадобится этот код:
Handlebars.registerHelper('ifItemSelected', function(item, options) {
var selected = false;
// lots of logic that determines if item is selected
if (selected) {
return options.fn(this);
}
else {
return options.inverse(this);
}
});
использовать с:
{{#ifItemSelected SomeItem}}
This was selected
{{else}}
This was not selected
{{/ifItemSelected}