除了在最后一个元素之后,如何在{{#each}}循环中的元素之间添加分隔符?

Chr*_*son 57 javascript handlebars.js ember.js

我有一个Handlebars模板,我正在尝试从数组生成以逗号分隔的项目列表.

在我的Handlebars模板中:

{{#each list}}
    {{name}} {{status}},
{{/each}}
Run Code Online (Sandbox Code Playgroud)

我希望,不要出现在最后一项上.有没有办法在Handlebars中执行此操作,还是需要回退到CSS选择器?

更新:基于克里斯托弗的建议,这是我最终实施的内容:

var attachments = Ember.CollectionView.extend({
    content: [],
    itemViewClass: Ember.View.extend({
        templateName: 'attachments',
        tagName: 'span',
        isLastItem: function() {
            return this.getPath('parentView.content.lastObject') == this.get('content');
        }.property('parentView.content.lastObject').cacheable()
    })
}));
Run Code Online (Sandbox Code Playgroud)

在我看来:

{{collection attachments}}
Run Code Online (Sandbox Code Playgroud)

和项目视图:

{{content.title}} ({{content.size}}) {{#unless isLastItem}}, {{/unless}}
Run Code Online (Sandbox Code Playgroud)

小智 123

我知道我迟到的部分,但我找到了一个更简单的方法

{{#unless @last}},{{/unless}}
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用Ember的把手,这不是那个. (14认同)
  • THIS is the one (9认同)
  • 我没有使用Ember,但是当我找到一种方法来实现这一点时,我遇到了这个问题.谢谢! (2认同)

小智 58

从Ember v1.11开始,您可以获得每个使用块参数的索引.在你的情况下,这看起来像这样:

{{#each list as |item index|}}
    {{if index ", "}}{{item.name}} {{item.status}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

第一个index值将0评估为false和将不被添加,所有后续值将评估为true哪个将添加分隔符.


Chr*_*sey 51

您可以使用标准CSS执行此操作:

li:after {
    content: ',';
}

li:last-of-type:after {
    content: '';
}
Run Code Online (Sandbox Code Playgroud)

我更喜欢单独的规则,但更简洁,如果可读性略低(来自评论中的@Jay):

li:not(:last-of-type):after {
    content: ',';
}
Run Code Online (Sandbox Code Playgroud)

  • 而不是使用`:after`和`last-child`,你可以使用`li + li:before`,使这一点稳固IE8(不要忘记[把它放在符合标准的渲染模式](http:/ /zurb.com/article/284/ie8-rendering-modes-one-meta-tag-to-rule-)!) (5认同)

alb*_*jan 6

对于 ember 2.7,您可以在安装后执行此操作ember-truth-helpers

ember install ember-truth-helpers
Run Code Online (Sandbox Code Playgroud)

然后你的模板将如下所示:

{{#each model as |e|}}
    {{e}}{{#unless (eq e model.lastObject)}}, {{/unless}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)


小智 5

我意识到这已经有一年了,但我遇到了类似的问题并且在这里结束了.就我而言,我实际上正在处理数组.所以,这是我的解决方案.

Handlebars.registerHelper('csv', function(items, options) {
    return options.fn(items.join(', '));
});

// then your template would be
{{#csv list}}{{this}}{{/csv}}
Run Code Online (Sandbox Code Playgroud)

我想要一个简单而优雅的解决方案,将csv逻辑保留在模板中.


小智 5

我创建了 sep 块助手:

Handlebars.registerHelper("sep", function(options){
    if(options.data.last) {
        return options.inverse();
    } else {
        return options.fn();
    }
});
Run Code Online (Sandbox Code Playgroud)

用法:

{{#each Data}}
   {{Text}}{{#sep}},{{/sep}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

支持 else 语句。