如何在Handlebars中获得每个助手的索引?

thu*_*ltz 257 javascript handlebars.js

我在我的项目中使用Handlebars进行模板化.有没有办法获得Handlebars中"每个"助手的当前迭代的索引?

<tbody>
     {{#each item}}
         <tr>
            <td><!--HOW TO GET ARRAY INDEX HERE?--></td>
            <td>{{this.key}}</td>
            <td>{{this.value}}</td>
         </tr>
     {{/each}}
</tbody>
Run Code Online (Sandbox Code Playgroud)

小智 504

在较新版本的Handlebars索引(或对象迭代的情况下的键)默认情况下提供标准的每个帮助程序.


摘录自:https://github.com/wycats/handlebars.js/issues/250#issuecomment-9514811

现在通过@index可以获得当前数组项的索引一段时间了:

{{#each array}}
    {{@index}}: {{this}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

对于对象迭代,请使用@key代替:

{{#each object}}
    {{@key}}: {{this}}
{{/each}} 
Run Code Online (Sandbox Code Playgroud)

  • 我试图在各种情况下实现这一点,每次我在控制台上出错.`Uncaught SyntaxError:意外的令牌,` (57认同)
  • 值得注意的是,截至[v1.2.0](http://github.com/wycats/handlebars.js/blob/master/release-notes.md#v120---december-23rd-2013),`@index现在,对于对象的每次迭代,都支持`和`@ first`. (7认同)
  • 如果您正在使用ASP.Net MVC Razor,则可以使用@@,即`{{@@ index}}`进行转义 (6认同)
  • [解决`未捕获的SyntaxError:意外的令牌,`](http://stackoverflow.com/questions/21841340/what-is-the-correct-way-of-getting-the-index-of-an-array-when-迭代-过它) (2认同)

小智 19

在较新版本的Ember中已经发生了变化.

对于数组:

{{#each array}}
    {{_view.contentIndex}}: {{this}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

看起来#each块不再适用于对象.我的建议是为它推出自己的帮助函数.

谢谢你的提示.


Nai*_*tik 13

我知道这太晚了.但我用以下代码解决了这个问题:

Java脚本:

Handlebars.registerHelper('eachData', function(context, options) {
      var fn = options.fn, inverse = options.inverse, ctx;
      var ret = "";

      if(context && context.length > 0) {
        for(var i=0, j=context.length; i<j; i++) {
          ctx = Object.create(context[i]);
          ctx.index = i;
          ret = ret + fn(ctx);
        }
      } else {
        ret = inverse(this);
      }
      return ret;
}); 
Run Code Online (Sandbox Code Playgroud)

HTML:

{{#eachData items}}
 {{index}} // You got here start with 0 index
{{/eachData}}
Run Code Online (Sandbox Code Playgroud)

如果你想用1开始你的索引你应该做以下代码:

使用Javascript:

Handlebars.registerHelper('eachData', function(context, options) {
      var fn = options.fn, inverse = options.inverse, ctx;
      var ret = "";

      if(context && context.length > 0) {
        for(var i=0, j=context.length; i<j; i++) {
          ctx = Object.create(context[i]);
          ctx.index = i;
          ret = ret + fn(ctx);
        }
      } else {
        ret = inverse(this);
      }
      return ret;
    }); 

Handlebars.registerHelper("math", function(lvalue, operator, rvalue, options) {
    lvalue = parseFloat(lvalue);
    rvalue = parseFloat(rvalue);

    return {
        "+": lvalue + rvalue
    }[operator];
});
Run Code Online (Sandbox Code Playgroud)

HTML:

{{#eachData items}}
     {{math index "+" 1}} // You got here start with 1 index
 {{/eachData}}
Run Code Online (Sandbox Code Playgroud)

谢谢.


Emb*_*eak 13

在车把3.0版以后,

{{#each users as |user userId|}}
  Id: {{userId}} Name: {{user.name}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

在此特定示例中,用户将具有与当前上下文相同的值,userId将具有迭代的索引值.请参阅块助手部分中的http://handlebarsjs.com/block_helpers.html


Reg*_*Boy 7

数组:

{{#each array}}
    {{@index}}: {{this}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

如果您有对象数组,则可以遍历子对象:

{{#each array}}
    //each this = { key: value, key: value, ...}
    {{#each this}}
        //each key=@key and value=this of child object 
        {{@key}}: {{this}}
        //Or get index number of parent array looping
        {{@../index}}
    {{/each}}
{{/each}}
Run Code Online (Sandbox Code Playgroud)

对象:

{{#each object}}
    {{@key}}: {{this}}
{{/each}} 
Run Code Online (Sandbox Code Playgroud)

如果您有嵌套的对象,则可以key使用 {{@../key}}