Пользовательский дескриптор Handlebars не разрешен

# 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 year_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 Handelbars helpers. Помощник, к сожалению, не разрешает свойства, так что property.symbol становится строкой.

Вот он:

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

Я думаю, что это возможно, но с правильным помощником - не знаю, какой из них.

Я бы хотел избежать использования вычислимого свойства, например if isYourSavings.

Ответ 1

Я не уверен в контексте вашего кода, но похоже, что вы ищете 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.