I am creating a custom handlebar helper but it always throws Object #<Object> has no method 'fn' when compiled through the terminal.
My handlebar helper is:
module.exports.register = function (Handlebars, opts, params) {
Handlebars.registerHelper('compimg', function (context, opts) {
var compImg = ["assets/img/icon-nope.png","assets/img/icon-check.png"];
return compImg[opts.fn(context)];
});
}
My .hbs file is:
{{#each checkable}}
<div class="col-md-3 col-xs-3 icon-container"><img src="{{compimg this}}"></div>
{{/each}}
My JSON file is:
{
"desc": "blablabla",
"checkable": [
1,
1,
1,
1
]
}
When I checked the official documentation I found this piece of code. Can someone explain what exactly context and options are here?
Handlebars.registerHelper('each', function(context, options) {
var ret = "";
for(var i=0, j=context.length; i<j; i++) {
ret = ret + options.fn(context[i]);
}
return ret;
});
The handlebars example for each is a block helper, which means that there is more markup or template syntax between the {{#each}} and {{/each}} tags. When you use this syntax, Handlebars passes an options parameter to your helper as the last argument. The options object contains a fn method that works just like a compiled template... var html = options.fn(context); gives you the rendered template from inside the block.
The context variable is the thing that you're passing into your helper and can be any number of arguments if you want more.
Since you're making an inline helper and a not a block helper, I think you only need to change one line...
return compImg[opts.fn(context)];
to
return compImg[context];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With