Вызов помощника в случае блокировки в ручном шаблоне
Я работаю с движком шаблонов Handlebars.js и пытаюсь найти способ сделать что-то вроде этого (надуманный пример):
{{#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}}
Но я не могу понять, как решить первый пример. Возможно, я приближаюсь к этому неправильно.
Кстати, я пометил это Усы, поскольку я не мог добавить тег Handlebars к вопросу.
Ответы
Ответ 1
Я не думаю, что это сработает. Если я правильно понимаю документацию по рулям, #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-statement.
Ответ 2
Вы должны добавить круглые скобки вокруг встроенного вспомогательного вызова:
{{#if (itemSelected "SomeItem")}}
<div>This was selected</div>
{{/if}
Я экспериментировал и проверял, что он просто работает.
Не уверен, что он упоминается в документации Handlebars. Я узнал трюк из примеров handlebars-layouts.
Ответ 3
С последней версией (1.0.rc.1) Handlebars вам нужно написать 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);
}
});
т. block (this) заменяется на options.fn(this)
http://handlebarsjs.com/block_helpers.html#conditionals
Ответ 4
Если вы хотите иметь еще одну опцию, вам понадобится этот код:
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}