Handlebars.js:如何在嵌套的每个中访问父索引?

时间:2013-02-13 13:17:03

标签: javascript handlebars.js

如何在每个循环中访问父@index值?

尝试以下方法:

{{#each company}}
{{#each employee}}
  {{../@index}} // how to access company index here?
{{/each}}
{{/each}}

这会导致错误:

  

期待'身份',获得'数据'

5 个答案:

答案 0 :(得分:72)

示例中存在语法错误。正确的语法是{{@../index}}

我们正在研究如何在未来版本的语言中支持这些参数的自定义命名,以便更容易处理。 https://github.com/wycats/handlebars.js/issues/907

答案 1 :(得分:26)

这对我有用:

{{#each company}}
{{setIndex @index}}
{{#each employee}}
  {{../index}}
{{/each}}
{{/each}}

JS:

Handlebars.registerHelper('setIndex', function(value){
    this.index = Number(value + 1); //I needed human readable index, not zero based
});

确保company对象没有index属性。

答案 2 :(得分:7)

答案: {{@../index}}

来自Handlebars docs(参见'每个'帮助部分的底部):

"嵌套的each块可以通过depted路径访问交互变量。例如,要访问父索引,可以使用{{@../index}}。"

注意:我使用的是v1.3,所以它至少是那么久了。

提醒:助手是您最后的最佳选择。 9/10有一个更好的解决方案。

答案 3 :(得分:4)

看起来Ember v2.2.0中有一个新语法。我在这里尝试了所有的答案,但他们并没有为我工作。

我发现的工作是命名父循环索引和子循环索引。

{{#each parents as |parent parentIndex|}}
    {{parentIndex}}
    {{#each children as |child childIndex|}}
        {{parentIndex}}
        {{childIndex}}
    {{/each}}
{{/each}}

答案 4 :(得分:1)

注册帮助方法:

Handlebars.registerHelper('eachWithIndex', function(cursor, options) {
    var fn = options.fn, inverse = options.inverse;
    var ret = "";
    var idx = -1;
    //console.log(cursor);
    cursor.forEach(function(item){
        idx++;
        console.log(item.index);
        item.index = idx;
        ret+=fn(item);
    });
    return ret;
}); 

把手模板:

{{#eachWithIndex outer}}
  {{#each inner}}
   {{../index}} // access outer index like this. I used hanlebars V1.3.0
   {{index}} // access inner index
  {{/each}}
{{/eachWithIndex}}