自定义Handlebars helper - 参数未解析

时间:2013-08-01 21:40:00

标签: ember.js handlebars.js

# 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}}

我动态创建表。所有内容都来自ArrayController,除了一个来自控制器的计算属性。 symbol' field is underscored like annual_fee'并且属于CreditCardProperty。每种卡类别都有不同的卡片属性。只有两个类别具有属性(类别具有许多卡属性),而一个记录的computed字段设置为true。这意味着模板应该查找相应的控制器。

由于symbol(例如age_to_apply)与其中一个CreditCard字段(ageToApply)相关,我所能想到的就是使用cardProperty帮助器,它在上下文中占用当前卡片(this)并解析property.symbol,例如:

camelizedProperty = categoryProperty.camelize()
card.get 'camelizedProperty'

理想情况下,我想在没有帮助程序的情况下使用它并以某种方式使用它:

# *** {{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}}

但问题是我不知道如何渲染'{{yourSavings}}'部分。您可以看到的助手来自swag collection of Handlebars helpers。遗憾的是,帮助程序不解析属性,因此property.symbol成为字符串。

这是:

Handlebars.registerHelper 'is', (value, test, options) ->
  if value is test then options.fn(@) else options.inverse(@)

我认为这是可能的,但with the right helper - 不知道哪一个。

我想避免的是采用像if isYourSavings这样的计算属性。

1 个答案:

答案 0 :(得分:6)

我不确定您的代码的上下文,但似乎您正在寻找带有块帮助程序的registerBoundHelper。这不受支持。你会遇到这个警告,

  

断言失败:registerBoundHelper生成的助手不支持与Handlebars块一起使用。

执行您正在执行的操作的另一种方法是使用视图助手。视图助手就像一个助手,但可以使用自定义模板进行渲染。

例如,CardItemView将是

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

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

cardItemTemplate的位置,

<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>

你可以使用这样的助手,

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

您可以传递任意数量的属性作为属性。这些将绑定到CardItemView。并且因为它是视图所做的任何事情,例如自定义计算属性,可以在CardItemView中完成。