在Handlebars模板中的If块中调用帮助器

Kev*_*vin 31 javascript client-templates handlebars.js

我正在使用Handlebars.js模板引擎,并试图找到一种方法来做这样的事情(人为的例子):

{{#if itemSelected "SomeItem"}}
    <div>This was selected</div>
{{/if}
Run Code Online (Sandbox Code Playgroud)

itemSelected是一个如此注册的助手:

Handlebars.registerHelper("itemSelected", function(item) {
    var selected = false;
    // Lots of logic that determines if item is selected
    return selected;
});
Run Code Online (Sandbox Code Playgroud)

尝试将此语法用于模板时出现错误,我找不到任何显示此类事物的示例.我确实看到像这样简单的#if块......

{{#if myValueInContext}}
    <div>This will show if myValueInContext results in a truthy value.</div>
{{/if}}
Run Code Online (Sandbox Code Playgroud)

但是,我无法弄清楚如何解决第一个例子.也许我正在接近这个错误.

顺便说一句,我标记了这个Mustache,因为我无法在问题中添加Handlebars标签.

小智 94

您应该在嵌入式帮助器调用周围添加括号:

{{#if (itemSelected "SomeItem")}}
    <div>This was selected</div>
{{/if}
Run Code Online (Sandbox Code Playgroud)

我做了实验并证实它确实有效.

不确定它是否在Handlebars文档中提到过.我从车把布局的例子中学到了诀窍.

  • 这应该更高. (16认同)
  • 是的,这是一个[子表达式](http://handlebarsjs.com/expressions.html#subexpressions).它是官方支持的,所以这是最简单的方法. (11认同)
  • 谢谢!应该标记为正确的答案. (4认同)

小智 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);
  }
});
Run Code Online (Sandbox Code Playgroud)

即.block(this)options.fn(this)取代

http://handlebarsjs.com/block_helpers.html#conditionals

  • 截至最新的Handlebars版本,这应该是公认的答案 (4认同)

Ste*_*fen 35

我不认为这会起作用.如果我理解把手文档是正确的,那么#if本身就是一个已注册的块助手,并且不会将另一个已注册的助手作为参数.

根据文档,您可以像这样实现它


Handlebars.registerHelper('ifItemSelected', function(item, block) {
  var selected = false;
  // lots of logic that determines if item is selected

  if(selected) {
    return block(this);
  }
});
Run Code Online (Sandbox Code Playgroud)

之后你应该可以用它来调用它


{{#ifItemSelected SomeItem}}
    This was selected
{{/ifItemSelected}
Run Code Online (Sandbox Code Playgroud)

但你必须确保SomeItem具有正确的格式.我没有看到在if语句中使用已注册的处理程序作为条件的方法.


Fio*_*ite 5

如果您也想使用else选项,则需要以下代码:

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);
 }
});
Run Code Online (Sandbox Code Playgroud)

用于:

{{#ifItemSelected SomeItem}}
    This was selected
{{else}}
    This was not selected
{{/ifItemSelected}
Run Code Online (Sandbox Code Playgroud)