【问题标题】:How to get index in Handlebars each helper?如何在 Handlebars 每个助手中获取索引?
【发布时间】:2012-08-09 13:49:55
【问题描述】:

我在我的项目中使用 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>

【问题讨论】:

标签: javascript handlebars.js


【解决方案1】:

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


sn-p 来自:https://github.com/wycats/handlebars.js/issues/250#issuecomment-9514811

当前数组项的索引已经通过@index 提供了一段时间:

{{#each array}}
    {{@index}}: {{this}}
{{/each}}

对于对象迭代,请改用@key:

{{#each object}}
    {{@key}}: {{this}}
{{/each}} 

【讨论】:

  • 我尝试在各种情况下实现这一点,每次我在控制台上遇到错误。 Uncaught SyntaxError: Unexpected token ,
  • 这可以正常工作,但如果您使用 @ 具有特殊含义的 Web 框架,请确保“@”字符被转义:)
  • 值得注意的是,从 v1.2.0 开始,@index@first 现在也支持对象的每次迭代。
  • 如果您使用的是 ASP.Net MVC Razor,则使用 @@ 转义,即 {{@@index}}
【解决方案2】:

这在较新版本的 Ember 中发生了变化。

对于数组:

{{#each array}}
    {{_view.contentIndex}}: {{this}}
{{/each}}

看起来#each 块不再适用于对象。我的建议是为它滚动你自己的辅助函数。

感谢tip

【讨论】:

    【解决方案3】:

    在车把版本 3.0 及以后,

    {{#each users as |user userId|}}
      Id: {{userId}} Name: {{user.name}}
    {{/each}}
    

    在这个特定示例中,user 将具有与当前上下文相同的值,而 userId 将具有迭代的索引值。 参考 - http://handlebarsjs.com/block_helpers.html 在块助手部分

    【讨论】:

      【解决方案4】:

      我知道这为时已晚。但我用以下代码解决了这个问题:

      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;
      }); 
      

      HTML:

      {{#eachData items}}
       {{index}} // You got here start with 0 index
      {{/eachData}}
      

      如果你想以 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];
      });
      

      HTML:

      {{#eachData items}}
           {{math index "+" 1}} // You got here start with 1 index
       {{/eachData}}
      

      谢谢。

      【讨论】:

      • 谢谢,您澄清了@index 从 0 开始,并提供了一种将其更改为基于 1 的索引的方法。正是我需要的。
      【解决方案5】:

      数组:

      {{#each array}}
          {{@index}}: {{this}}
      {{/each}}
      

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

      {{#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}}
      

      对象:

      {{#each object}}
          {{@key}}: {{this}}
      {{/each}} 
      

      如果你有嵌套对象,你可以访问父对象的key {{@../key}}

      【讨论】:

        【解决方案6】:

        在 hbs 中使用循环有点复杂

        <tbody>
             {{#each item}}
                 <tr>
                    <td><!--HOW TO GET ARRAY INDEX HERE?--></td>
                    <td>{{@index}}</td>
                    <td>{{this}}</td>
                 </tr>
             {{/each}}
        </tbody>
        

        Learn more

        【讨论】:

          【解决方案7】:

          在车把版本 4.0 以后,

          {{#list array}}
            {{@index}} 
          {{/list}}
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-02-03
            • 2019-02-05
            相关资源
            最近更新 更多