web-dev-qa-db-fra.com

Comment obtenir un index dans le guidon de chaque aide?

J'utilise des guidons pour la création de modèles dans mon projet. Existe-t-il un moyen d’obtenir l’index de l’itération actuelle d’un "chaque" assistant dans le guidon?

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

Dans les nouvelles versions de Handlebars, l'index (ou la clé dans le cas d'une itération d'objet) est fourni par défaut avec le standard de chaque aide.


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

L'index de l'élément de tableau actuel est disponible depuis un certain temps via @index:

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

Pour l'itération d'objet, utilisez plutôt @key:

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

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. Ma suggestion est de lancer votre propre fonction d'assistance pour cela.

Merci pour cela astuce .

19
Ryan Lewis

À partir de la version 3.0 du guidon,

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

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

13
Ember Freak

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

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

si vous voulez commencer votre index avec 1, vous devriez 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}}

Merci.

13
Naitik

Tableaux:

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

Si vous avez des tableaux d'objets ... vous pouvez parcourir 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 à la key de l'objet parent avec {{@../key}}

7
RegarBoy