286 votes

Comment obtenir l'index de chaque aide dans le guidon ?

J'utilise Handlebars comme modèle dans mon projet. Existe-t-il un moyen d'obtenir l'index de l'itération actuelle d'une aide "each" dans Handlebars ?

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

1 votes

Vous pouvez par exemple enregistrer votre propre aide à cet effet : gist.github.com/1048968 ou : pastebin.com/ksGrVYkz

1 votes

J'ai ajouté une autre solution à l'exemple Gist qui fonctionne avec handlebars-1.0.rc.1.js. gist.github.com/1048968#gistcomment-617934

549voto

ro60 Points 2254

Dans les versions plus récentes de Handlebars, l'index (ou la clé dans le cas de l'itération d'un objet) est fourni par défaut avec l'aide standard each.


extrait de : https://github.com/wycats/handlebars.js/issues/250#issuecomment-9514811

L'index de l'élément courant du tableau est disponible depuis un certain temps déjà via @index :

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

Pour l'itération des objets, utilisez plutôt @key :

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

58 votes

J'ai essayé de mettre en œuvre cette méthode dans différentes situations, mais à chaque fois, j'obtiens une erreur dans la console. Uncaught SyntaxError: Unexpected token ,

1 votes

Cela fonctionne bien mais assurez-vous que le caractère '@' est échappé si vous utilisez un framework web où @ a une signification spéciale :)

0 votes

J'ai le même problème dans rails avec les fichiers .hbs. Je ne sais pas comment échapper au caractère @, est-ce l'environnement ?

18voto

ryanmurakami Points 61

Cela a changé dans les nouvelles versions d'Ember.

Pour les tableaux :

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

Il semble que le bloc #each ne fonctionne plus sur les objets. Je vous suggère de créer votre propre fonction d'aide pour ce bloc.

Merci pour cette conseil .

16voto

Ember Freak Points 11453

À partir de la version 3.0 du guidon,

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

Dans cet exemple particulier, user aura la même valeur que le contexte actuel et userId aura la valeur de l'index pour l'itération. Référence - http://handlebarsjs.com/block_helpers.html dans la section des aides de bloc

14voto

Naitik Points 1238

Je sais que c'est trop tard. Mais j'ai résolu ce problème avec le code suivant :

Java script :

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

si vous voulez commencer votre index avec 1 vous devez faire le code suivant :

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

Gracias.

7voto

developer Points 152

Les tableaux :

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

Si vous avez des tableaux d'objets... vous pouvez itérer à travers les enfants :

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

Objets :

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

Si vous avez des objets imbriqués, vous pouvez accéder à l'objet key de l'objet parent avec {{@../key}}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X