Indice posizionale nell'iterazione delle raccolte Ember.js
-
28-10-2019 - |
Domanda
C'è un modo per ottenere l'indice posizionale durante l'iterazione in ember.js?
{{#each itemsArray}}
{{name}}
{{/each}}
Sto cercando un modo per avere qualcosa del tipo:
{{#each itemsArray}}
{{name}} - {{index}}th place.
{{/each}}
Aggiornamento:
Secondo il commento di @ebryn, il codice seguente funziona senza utilizzare una vista nidificata per ciascun elemento:
<script type="text/x-handlebars">
{{#collection contentBinding="App.peopleController"}}
Index {{contentIndex}}: {{content.name}} <br />
{{/collection}}
</script>
Sebbene per avere qualcosa come adjustmentIndex, sarebbe necessaria una vista nidificata.
Soluzione
È una vecchia domanda ma riceve ancora molti successi.Nella versione attuale di Ember.JS è possibile utilizzare _view.contentIndex
per visualizzare l'indice corrente all'interno del ciclo.
{{#each}}
Index: {{_view.contentIndex}}
{{/each}}
Se è necessario un indice modificato (ad esempio a partire da 1), esiste la possibilità di creare un helper riutilizzabile increment
Ember.Handlebars.registerBoundHelper('increment', function(integer) {
return integer + 1;
});
quindi lo useresti nel modo seguente
{{#each}}
Index: {{increment _view.contentIndex}}
{{/each}}
Aggiornamento
A partire da Ember 1.11 puoi farlo anche tu
{{#each people as |person index|}}
Index: {{increment index}}
{{/each}}
Altri suggerimenti
Nell'RC6 CollectionView
fornisce contentIndex
proprietà per ogni vista renderizzata della raccolta. Each
usi dell'aiutante CollectionView
nella sua implementazione in modo da poter accedere all'indice in questo modo:
{{#each itemsArray}}
{{_view.contentIndex}}
{{/each}}
In realtà sì, puoi ottenere la posizione dell'indice corrente utilizzando l'helper {{each}}.Devi creare una vista per ogni elemento in un elenco e quindi utilizzare {{_parentView.contentIndex}}
.
<script type="text/x-handlebars">
{{#each App.peopleController}}
{{#view App.PersonView contentBinding="this"}}
Index {{_parentView.contentIndex}}: {{content.name}} {{adjustedIndex}} <br />
{{/view}}
{{/each}}
</script>
App = Ember.Application.create();
App.peopleController = Ember.ArrayController.create({
content: [ { name: 'Roy' }, { name: 'Mike' }, { name: 'Lucy' } ]
});
App.PersonView = Ember.View.extend(Ember.Metamorph, {
content: null,
// Just to show you can get the current index here too...
adjustedIndex: function() {
return this.getPath('_parentView.contentIndex') + 1;
}.property()
});
Vedere questo jsFiddle per un esempio funzionante.
A partire da Ember 9.8 e versioni precedenti alla 1.0 puoi racchiudere il "contentIndex" in una vista per arrivare al genitore virtuale (il {{#each}}).Se non aggiungi la vista, il tuo contesto finirà per essere il modello principale, un elemento nel tuo elenco o qualunque cosa tu abbia impostato manualmente con il tuo {{#with}}
.Non è impossibile arrivare al {{#each}}
dal lato JS, ma è molto più doloroso sfogliare le opinioni di quei bambini.
{{#each App.peopleController}}
{{#view}}
Index {{view._parentView.contentIndex}}: {{name}} <br />
{{/view}}
{{/each}}
...OR...
{{#each people in App.peopleController}}
{{#view}}
Index {{view._parentView.contentIndex}}: {{people.name}} <br />
{{/view}}
{{/each}}
Nel caso in cui volessi un violinista.
Nota:Puoi creare una vista e fare a this.get("_parentView.contentIndex")
per accedere all'indice se si desidera modificare del tutto il numero.
Questa non è attualmente una funzionalità di Handlebars o Ember.Handlebars
.Abbiamo contentIndex
disponibile all'interno #collection
/Ember.CollectionView
.Penso che sia utile supportarlo #each
pure.Si prega di inviare un problema al repository GitHub: https://github.com/emberjs/ember.js/issues
A partire da Ember 1.11.0, index
è un parametro facoltativo in each
blocchi:
{{#each items as |item index|}}
{{item.name}} is at index {{index}}
{{/each}}
Ho modificato leggermente la soluzione ud3323 utilizzando collection.Controlla qui: http://jsfiddle.net/johngouf/WSwna/13/
<script type="text/x-handlebars">
{{#collection contentBinding="App.peopleController"}}
{{#view App.PersonView contentBinding="this"}}
Index {{_parentView.contentIndex}}: {{content.name}} {{adjustedIndex}} <br />
{{/view}}
{{/collection}}
</script>
App = Ember.Application.create();
App.peopleController = Ember.ArrayController.create({
content: [ { name: 'Roy' }, { name: 'Mike' }, { name: 'Lucy' } ]
});
App.PersonView = Ember.View.extend({
content: null,
// Just to show you can get the current index here too...
adjustedIndex: function() {
return this.getPath('_parentView.contentIndex') + 1;
}.property()
});
Penso che probabilmente anche tu potresti fare qualcosa del genere
//add index property to all each queries
Handlebars.registerHelper('each', function(context, block) {
var ret = "";
for(var i=0, j=context.length; i<j; i++) {
context[i].index = i;
ret = ret + block(context[i]);
}
return ret;
});