custom Handlebars helper - parameter is not resolved

ember.js, handlebars.js

Solution

I am not certain about the context of your code, but it seems like you are looking for `registerBoundHelper` with a block helper. This isn't supported. You will run into this warning,

Assertion failed: registerBoundHelper-generated helpers do not support use with Handlebars blocks.

An alternative way to do what you are doing is to use a view helper instead. A view helper is like a helper but can render with a custom template.

For instance a `CardItemView` would be,

App.CardItemView = Em.View.extend({
  templateName: 'cardItemTemplate'
});

Em.Handlebars.registerHelper('cardItem', App.CardItemView);

Where the `cardItemTemplate` is,

<script type='text/x-handlebars' data-template-name='cardItemTemplate'>
  {{#if view.property.symbol}}
    <td class="td">{{yourSavings}}</td>
  {{else}}
    <td class="td">{{cardProperty view.property.symbol}}</td>
  {{/if}}
</script>

And you could use the helper like so,

{{#with controllers.currentCardCategory}}
  {{#each property in cardProperties}}
    {{cardItem property=property etc}}
  {{/each}}
{{/with}}

You can pass in any number of properties as attributes. These will be bound to the `CardItemView`. And since it's a view anything a view does, like custom computed properties, can be done in `CardItemView`.

Problem

``` # here is CreditCards controller context {{#with controllers.currentCardCategory}} {{#each property in cardProperties}} {{#is property.symbol 'your_savings'}} <td class="td">{{yourSavings}}</td> {{else}} <td class="td">{{cardProperty this property.symbol}}</td> {{/is}} {{/each}} {{/with}} ``` I create the table dynamically. All content comes from `ArrayController` except one that is a computed property that comes from the controller. `symbol' field is underscored like`annual_fee' and belongs to `CreditCardProperty`. Each card category has different set of card properties. Only two categories have properties (category has many card properties) and one record has `computed` field set to `true`. That means that the template should look up the corresponding controller. As `symbol` (e.g age_to_apply) relates to one of the CreditCard fields (`ageToApply`) all I could to figure out was to use the `cardProperty` helper which takes current card in the context (`this`) and resolves `property.symbol`, e.g: ``` camelizedProperty = categoryProperty.camelize() card.get 'camelizedProperty' ``` Ideally I'd like to do without the helper and use it somehow like this: ``` # *** {{property.symbol}} should look up this context # and become e.g {{annual_fee}} or {{annualFee}} - is it possible? {{#with controllers.currentCardCategory}} {{#each property in cardProperties}} <td class="td">{{property.symbol}}***</td> {{/each}} {{/with}} ``` But the problem is that I don't know how can I render that '{{yourSavings}}' part. The helper you can see comes from swag collection of Handlebars helpers. The helper, unfortunately does not resolve properties so that `property.symbol` becomes a string. Here it is: ``` Handlebars.registerHelper 'is', (value, test, options) -> if value is test then options.fn(@) else options.inverse(@) ``` I think it is possible but with the right helper - don't know which one, though. What I do would like to avoid is to resort to computed property like `if isYourSavings`.

Original source

Related problems