Calling Helper Within If Block in Handlebars Template

六月ゝ 毕业季﹏ 提交于 2020-01-22 05:40:24

问题


I am working with Handlebars.js template engine and am trying to figure out a way to do something like this (contrived example):

{{#if itemSelected "SomeItem"}}
    <div>This was selected</div>
{{/if}

where itemSelected is a registered helper like this:

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

I get errors when trying to use this syntax for the template, and I cannot find any example showing this kind of thing. I do see simple #if blocks like this...

{{#if myValueInContext}}
    <div>This will show if myValueInContext results in a truthy value.</div>
{{/if}}

But, I can't figure out how to tackle the first example. Maybe I am approaching this wrong.

By the way, I tagged this Mustache as I could not add a Handlebars tag to the question.


回答1:


I don't think this is going to work. If I understand the handlebars documentation correct, the #if is a registered block-helper itself and does not take another registered helper as an argument.

According to the documentation you might implement it like that


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

  if(selected) {
    return block(this);
  }
});

Afterwards you should be able to call it with


{{#ifItemSelected SomeItem}}
    This was selected
{{/ifItemSelected}

but you have to make sure SomeItem has the proper format. I don't see a way to use a registered handler as conditional in an if-statement.




回答2:


You should add parentheses around the embedded helper invocation:

{{#if (itemSelected "SomeItem")}}
    <div>This was selected</div>
{{/if}

I did experiments and verified that it just works.

Not sure if it's mentioned in the Handlebars documentation. I learned the trick from the examples of handlebars-layouts.




回答3:


With last version (1.0.rc.1) of Handlebars, you have to write sth like:

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. block(this) is replaced by options.fn(this)

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




回答4:


If you want to have an else option too, you will need this code:

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);
 }
});

Used with:

{{#ifItemSelected SomeItem}}
    This was selected
{{else}}
    This was not selected
{{/ifItemSelected}


来源:https://stackoverflow.com/questions/6319231/calling-helper-within-if-block-in-handlebars-template

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!