В handlebars.js вы можете сделать это с помощью вспомогательной функции. (На самом деле, одно из преимуществ упомянутых здесь рулей http://yehudakatz.com/2010/09/09/announcing-handlebars-js/ заключается в том, что вы можете использовать помощники вместо необходимости переписывать объекты перед вызовом шаблона.
Итак, вы можете сделать это:
var nameIndex = 0;
Handlebars.registerHelper('name_with_index', function() {
nameIndex++;
return this.name + " is " + nameIndex;
})
И тогда ваш шаблон может быть таким:
{{#names}}
<li>{{name_with_index}}</li>
{{/names}}
Ваши данные такие же, как и раньше, т. Е .:
{ "names": [ {"name":"John"}, {"name":"Mary"} ] };
И вы получите такой вывод:
<li>John is 1</li>
<li>Mary is 2</li>
Чтобы это действительно работало, nameIndex должен сбрасываться каждый раз при рендеринге шаблона, поэтому для этого у вас может быть помощник сброса в начале списка. Полный код выглядит так:
var data = { "names": [ {"name":"John"}, {"name":"Mary"} ] };
var templateSource = "<ul>{{reset_index}}{{#names}}<li>{{name_with_index}}</li>{{/names}}</ul>";
var template = Handlebars.compile(templateSource);
var helpers = function() {
var nameIndex = 0;
Handlebars.registerHelper('name_with_index', function() {
nameIndex++;
return this.name + " is " + nameIndex;
});
Handlebars.registerHelper('reset_index', function() {
nameIndex = 0;
})
}();
var htmlResult= template(data);
$('#target').html(htmlResult);
var htmlResult2= template(data);
$('#target2').html(htmlResult2);
(Это может правильно отобразить шаблон дважды.)