在把手中处理对象中数组的最佳方法

时间:2013-06-13 23:56:07

标签: javascript handlebars.js

我正在学习如何使用把手,我不确定展示我的物体的最佳方式是什么。

基本上,我有一个复杂的对象要显示。对象是这样的:

{
  bookList: [{
    name: "the name",
    reviewers: ["a reviewer name", "another reviewer"]
  }]
}

然后我的把手模板需要显示如下内容:

{{#each bookList}}
<tr class="row">
<td class="cell">{{name}}</td>
<td class="cell">need to display comma separated names here, like this: "a reviewer name, another reviewer</td>
<td class="cell">display number of reviewers here, like this: "2"</td>
</tr>
{{/each}}

但是我不确定我该怎么做,或者最好的方法是做什么。在我将其传递给手柄模板之前,我可以轻松地在javascript中预格式化我的javascript对象,并添加“commaSeparatedReviewers”和“numberOfReviewers”之类的字段,但似乎用手把更高效/更好帮助我想?

我可以使用把手助手做一些事情,比如从数组中创建一个逗号分隔的字符串,并计算数组中的元素吗?如果是这样,我该怎么做?

3 个答案:

答案 0 :(得分:4)

对于谷歌搜索的任何人,你也可以直接实现它:

{{#each array}}
    {{this}}{{#unless @last}}, {{/unless}}
{{/each}}

答案 1 :(得分:2)

该循环中的

{{reviewers.length}}将为您提供审阅者的数量(数组的大小)。

AFAIK没有帮助者可以轻松地使用分隔符连接数组(例如,获取逗号分隔的审阅者列表),但您可以编写自定义帮助程序,例如:

GitHub feature request

以下是某人为实施join帮助程序而发布的解决方案:

Handlebars.registerHelper('join', function(val, delimiter, start, end) {
    var arry = [].concat(val);
    delimiter = ( typeof delimiter == "string" ? delimiter : ',' );
    start = start || 0;
    end = ( end === undefined ? arry.length : end );
    return arry.slice(start, end).join(delimiter); 
});

答案 2 :(得分:2)

较早的问题,但在我寻找类似问题的解决方案时,它出现了。我想我会分享我的解决方案。

Handlebars现在支持两年前可能无法使用的一些属性。即@first@last。见Handlebars docs

你应该可以这样做:

{{#each bookList}}
  <tr class="row">
    <td class="cell">{{name}}</td>
    <td class="cell">
      {{#each reviewers}}
        {{#unless @first}}, {{/unless}}
        {{this.code}}
      {{/each}}</td>
    <td class="cell">{{reviewers.length}}</td>
  </tr>
{{/each}}