2012-08-09 9 views
223

Estoy usando manubrios para plantillas en mi proyecto. ¿Hay alguna manera de obtener el índice de la iteración actual de un "cada" ayudante en manubrios?¿Cómo obtener el índice en los manubrios de cada ayudante?

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

Puede registrar su propio ayudante para hacer esto, por ejemplo: https://gist.github.com/1048968 o: http://pastebin.com/ksGrVYkz – stusmith

+1

Agregué otra solución al ejemplo Gist que funciona con handlebars-1.0.rc.1.js. https://gist.github.com/1048968#gistcomment-617934 – mlienau

Respuesta

451

En las nuevas versiones de índice Manillares (o la tecla en el caso de iteración objeto) se proporciona por defecto con el estándar cada ayudante.


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

El índice del elemento de la matriz actual ha estado disponible desde hace algún tiempo a través de @index:

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

para la iteración objeto, utilice @key lugar:

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

Lo siento por el voto en negativo. Se suponía que era un voto positivo, pero cuando me di cuenta de que había sido bloqueado. – Undistraction

+56

He intentado implementar esto en varias situaciones, cada vez que recibo un error en la consola. 'Uncaught SyntaxError: token inesperado,' – waltfy

+0

El mismo problema que waltercarvalho – dmkc

19

Esto ha cambiado en las versiones más nuevas de Ember.

Para las matrices:

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

Parece que el bloque #each ya no funciona en objetos. Mi sugerencia es rodar su propia función auxiliar para ello.

Gracias por este tip.

12

Sé que esto es demasiado tarde. Pero he resuelto este problema con el siguiente código:

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 desea iniciar su índice con 1 que debe hacer siguiente código:

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.

+0

Gracias, usted aclaró que @index comienza en 0, y proporcionó un método para cambiarlo a 1 índice basado. Exactamente lo que necesitaba. – Rebs

+0

Me alegro de ayudarte ... :) – Naitik

5

En manillar versión 3.0 en adelante,

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

En este ejemplo particular, el usuario tendrá el mismo valor que el contexto actual y userId tendrá el valor de índice para la iteración. Consulte - http://handlebarsjs.com/block_helpers.html ayudantes en la sección de bloque

2

matrices:

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

Si tiene matrices de objetos ...Se puede recorrer a los niños:

{{#each array}} 
    //each this = { key: value, key: value, ...} 
    {{#each this}} 
     //each [email protected] and value=this of child object 
     {{@key}}: {{this}} 
     //Or get index number of parent array looping 
     {{@../index}} 
    {{/each}} 
{{/each}} 

Objetos:

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

objetos Si ha anidados se puede acceder al key del objeto padre con {{@../key}}

Cuestiones relacionadas