在自定义Handlebars帮助程序中使用linkTo



我正在使用Handlebars助手来解析一组对象,我希望将返回的结果封装在#linkTo调用中,这样Embers路由器就会接收它。

以下是我在视图中对它的称呼:{{buildBreadcrumb my_objects}}

以下是我的助手的样子:

Ember.Handlebars.registerHelper 'buildBreadcrumb', (val, opts) ->
  value = Ember.get(this, val)
  out = ""
  value.forEach (group, index) =>
    if value.length - index == 2
      out += '{{#linkTo group ' + group.name + '}}'
    if value.length - index == 1
      out += '{{#linkTo group ' + group.name + '}}'
  out

出于显而易见的原因,上面只是将{{#linkTo ...}}解析为一个文本字符串。有什么方法可以让我按照我想要的方式解析它吗?我很清楚我可以在视图中使用{{#each}}等,但由于我的用例,我不得不使用助手来构建它。有什么建议吗?

您可以编写一个自定义的Handlebars视图帮助程序。该视图可以封装#each逻辑,而最终的助手看起来与这里的基本相似。使用中唯一的区别是必须将参数作为属性传递给View辅助对象。

创建此辅助对象的方法是传入View类,而不是辅助对象函数。

App.BreadcrumbView = Ember.View.extend({
  templateName: 'breadcrumb',
  penultimate: function() {
    var length = this.get('items').length;
    return this.get('items')[length - 2];
  }.property('items'),
  last: function() {
    var length = this.get('items').length;
    return this.get('items')[length - 1];
  }.property('items')
});
Ember.Handlebars.helper('breadcrumb', App.BreadcrumbView);

以及相应的模板

<script type='text/x-handlebars' data-template-name='breadcrumb'>
  <ul class="breadcrumb">
    {{#each item in view.items}}
      <li>{{#linkTo 'group' item}}{{item.id}}{{/linkTo}} &raquo;
      </li>
    {{/each}}
  </ul>    
</script> 

要使用应用程序中的帮助程序,

<script type='text/x-handlebars' data-template-name='breadcrumb'>
  <ul class="breadcrumb">
    <li>{{#linkTo 'group' view.penultimate}}{{view.penultimate.id}}{{/linkTo}} &raquo;</li>
    <li>{{#linkTo 'group' view.last}}{{view.last.id}}{{/linkTo}}</li>
  </ul>    
</script>  

这种方法的一个好处是绑定是自动连接的,因此更改项数据将自动更新breadcrumb视图,从而保留内部Metamorphing。

下面是一个jsbin示例。

最新更新