我正在使用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}}
但是,我无法弄清楚如何解决第一个例子。也许我正在接近这个错误。
顺便说一下,我标记了这个Mustache,因为我无法在问题中添加Handlebars标签。
答案 0 :(得分:89)
您应该在嵌入式帮助程序调用周围添加括号:
{{#if (itemSelected "SomeItem")}}
<div>This was selected</div>
{{/if}
我做了实验并证实它确实有效。
不确定是否在Handlebars文档中提到过它。我从handlebars-layouts的例子中学到了诀窍。
答案 1 :(得分:44)
使用Handlebars的最后一个版本(1.0.rc.1),你必须写得像:
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)
取代答案 2 :(得分:32)
我不认为这会起作用。如果我理解把手文档是正确的,那么#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语句中使用已注册的处理程序作为条件的方法。
答案 3 :(得分:5)
如果您还想要其他选项,则需要以下代码:
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}