Позиционный индекс в итерации коллекции Ember.js

Есть ли способ получить позиционный индекс во время итерации в ember.js?

{{#each itemsArray}} {{name}} {{/each}} 

Я ищу способ получить что-то вроде:

 {{#each itemsArray}} {{name}} - {{index}}th place. {{/each}} 

Обновить:

В соответствии с комментарием @ebryn приведенный ниже код работает без использования вложенного представления для каждого элемента:

  {{#collection contentBinding="App.peopleController"}} Index {{contentIndex}}: {{content.name}} 
{{/collection}} ​

http://jsfiddle.net/WSwna/14/

Хотя иметь что-то вроде adjustIndex, требуется nested представление.

Это старый вопрос, но до сих пор много хитов. В текущей версии Ember.JS можно использовать _view.contentIndex для отображения текущего индекса внутри цикла.

 {{#each}} Index: {{_view.contentIndex}} {{/each}} 

Если вам нужен скорректированный индекс (например, начиная с 1), тогда существует возможность создания многоразового вспомогательного increment

 Ember.Handlebars.registerBoundHelper('increment', function(integer) { return integer + 1; }); 

то вы будете использовать его следующим образом

 {{#each}} Index: {{increment _view.contentIndex}} {{/each}} 

Обновить

Начиная с ember 1.11 вы также можете сделать

 {{#each people as |person index|}} Index: {{increment index}} {{/each}} 

В RC6 CollectionView предоставляет contentIndex для каждого визуализированного представления коллекции. Each помощник использует CollectionView в своей реализации, поэтому вы можете получить доступ к индексу таким образом:

 {{#each itemsArray}} {{_view.contentIndex}} {{/each}} 

Фактически да, вы можете получить позицию текущего индекса с помощью помощника {{each}}. Вы должны создать представление для каждого элемента в списке, а затем использовать {{_parentView.contentIndex}} .

  

 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() }); 

См. Этот jsFiddle для рабочего примера.

Начиная с Ember 9.8 и pre-1.0 вы можете обернуть «contentIndex» представлением, чтобы получить виртуального родителя ({{#each}}). Если вы не добавляете представление, ваш контекст становится либо основным шаблоном, либо элементом в вашем списке, либо тем, что вы вручную установили с помощью {{#with}} . Невозможно попасть на {{#each}} со стороны JS, но это гораздо больший боль, перелистывающий эти дочерние представления.

 {{#each App.peopleController}} {{#view}} Index {{view._parentView.contentIndex}}: {{name}} 
{{/view}} {{/each}} ...OR... {{#each people in App.peopleController}} {{#view}} Index {{view._parentView.contentIndex}}: {{people.name}}
{{/view}} {{/each}}

В любом случае вы хотели бы скрипача.

DEMO

Примечание. Вы можете создать представление и сделать this.get("_parentView.contentIndex") чтобы получить индекс, если вы хотите вообще изменить номер.

В настоящее время это не особенность Handlebars или Ember.Handlebars . У нас есть contentIndex ansible внутри #collection / Ember.CollectionView . Я думаю, что это полезно для поддержки в #each . Пожалуйста, зарегистрируйте проблему в репозитории GitHub: https://github.com/emberjs/ember.js/issues

Начиная с Ember 1.11.0, index является необязательным параметром в each блоке:

 {{#each items as |item index|}} {{item.name}} is at index {{index}} {{/each}} 

Я изменил бит решение ud3323, используя коллекцию. Посмотрите здесь: http://jsfiddle.net/johngouf/WSwna/13/

  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() }); 

Я думаю, вы, вероятно, тоже могли бы сделать что-то подобное

 //add index property to all each queries Handlebars.registerHelper('each', function(context, block) { var ret = ""; for(var i=0, j=context.length; i 
Давайте будем гением компьютера.