2012-08-09 11 views
223

Uso il manubrio per il template nel mio progetto. C'è un modo per ottenere l'indice dell'iterazione corrente di un "ogni" helper in Handlebar?Come ottenere l'indice in Handlebars per ogni helper?

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

È possibile registrare il proprio aiuto per farlo questo, ad esempio: https://gist.github.com/1048968 o: http://pastebin.com/ksGrVYkz – stusmith

+1

Ho aggiunto un'altra soluzione all'esempio Gist che funziona con handlebars-1.0.rc.1.js. https://gist.github.com/1048968#gistcomment-617934 – mlienau

risposta

451

Nelle versioni più recenti di indice Manubri (o chiave nel caso di oggetto iterazione) è fornito di default con lo standard ogni helper.


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

L'indice dell'elemento dell'array corrente è stato disponibile per qualche tempo via @index:

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

per oggetto iterazione, usa invece @key:

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

Ci scusiamo per il downvote. Doveva essere un upvote, ma quando ho notato che era stato bloccato. – Undistraction

+56

Ho provato a implementarlo in varie situazioni, ogni volta che ottengo un errore sulla console. 'Uncaught SyntaxError: Token imprevisto,' – waltfy

+0

Lo stesso problema di waltercarvalho – dmkc

19

Questo è cambiato nelle versioni più recenti di Ember.

Per gli array:

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

Sembra che il blocco #each non funziona più sugli oggetti. Il mio suggerimento è di eseguire la propria funzione di supporto per questo.

Grazie per questo tip.

12

So che è troppo tardi. Ma ho risolto questo problema con la seguente Codice:

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

se si vuole iniziare l'indice con 1 si dovrebbe fare seguente codice:

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

Grazie.

+0

Grazie, hai chiarito che @index inizia da 0 e ha fornito un metodo per cambiarlo in un indice basato su 1. Esattamente quello di cui avevo bisogno. – Rebs

+0

Felice di aiutarti ... :) – Naitik

5

In manubrio versione 3.0 in poi,

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

In questo particolare esempio, l'utente avrà lo stesso valore del contesto attuale e userId avrà il valore di indice per l'iterazione. Fare riferimento - http://handlebarsjs.com/block_helpers.html nella sezione aiutanti blocco

2

Array:

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

Se si dispone di un array di oggetti ...è possibile scorrere i bambini:

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

Oggetti:

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

oggetti Se si hanno nidificato è possibile accedere alla key dell'oggetto genitore con {{@../key}}

Problemi correlati