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

时间:2011-06-11 23:50:02

标签: javascript handlebars.js client-templates

我正在使用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标签。

4 个答案:

答案 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)

取代

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

答案 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}