0

使用 Handlebarjs,我想循环一个数组,并显示值,用分隔符分隔。如果我要显示的内容也不是模板,那将很容易;)

这是我的情况:

accounts = [
     {'name': 'John', 'email': 'john@example.com'},
     {'name': 'Malcolm', 'email': 'malcolm@example.com'},
     {'name': 'David', 'email': 'david@example.com'}
];

{{#each accounts}}
    <a href="mailto:{{ email }}" title="Send an email to {{ name }}">{{ name }}</a>,
{{/each}}

这个实现的问题是我会有这个输出:

约翰、马尔科姆、大卫、

我希望它是:

约翰、马尔科姆、大卫

我怎样才能做到这一点 ?

4

2 回答 2

3

您可以使用 CSS 伪类:after,连同内容,来实现所需的“格式化”。(:after以及当今大多数浏览器和 IE8+ 中的内容支持。)

例如:

HTML:

<a href="mailto:xxx@xxxx.com" title="Send an email to Foo">Foo1</a>
<a href="mailto:xxx@xxxx.com" title="Send an email to Foo">Foo2</a>
<a href="mailto:xxx@xxxx.com" title="Send an email to Foo">Foo3</a>

CSS:

a {
  color: red;
}
a:after {
  content: ", ";
}
a:last-child:after {
  content: "";
}

结果:

Foo1, Foo2, Foo3
于 2012-12-13T15:00:14.407 回答
2

我实现了一个新的 foreach 助手,可以做到这一点:

Handlebars.registerHelper('foreach', function (array, fn) {
    var total = array.length;
    var buffer = '';

    //Better performance: http://jsperf.com/for-vs-foreach/2
    for (var i = 0, j = total; i < j; i++) {
        var item = array[i];

        // stick an index property onto the item, starting with 1, may make configurable later
        item['_index'] = i+1;
        item['_total'] = total;
        item['_isFirst'] = (i === 0);
        item['_isLast'] = (i === (total - 1));

        // show the inside of the block
        buffer += fn.fn(item);
    }

    // return the finished buffer
    return buffer;
});

接着 :

{{#foreach accounts}}
    <a href="mailto:{{ email }}" title="Send an email to {{ name }}">{{ name }}</a>{{#unless _isLast}}, {{/unless}}
{{/foreach}}
于 2012-12-13T13:41:31.403 回答