Dans handlebars.js, vous pouvez accomplir cela avec une fonction d'aide. (En fait, l'un des avantages mentionnés à propos de handlebars ici http://yehudakatz.com/2010/09/09/announcing-handlebars-js/ est que vous pouvez utiliser des aides au lieu de devoir réécrire les objets avant d'appeler le modèle.
Donc, tu pourrais faire ça :
var nameIndex = 0;
Handlebars.registerHelper('name_with_index', function() {
nameIndex++;
return this.name + " is " + nameIndex;
})
Et, ensuite, votre modèle peut être celui-ci :
{{#names}}
<li>{{name_with_index}}</li>
{{/names}}
Vos données sont les mêmes que précédemment, à savoir :
{ "names": [ {"name":"John"}, {"name":"Mary"} ] };
Et vous obtenez ce résultat :
<li>John is 1</li>
<li>Mary is 2</li>
Pour que cela fonctionne vraiment, nameIndex doit être réinitialisé à chaque fois que le modèle est rendu, donc pour ce faire, vous pouvez avoir une aide de réinitialisation au début de la liste. Le code complet ressemble donc à ceci :
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);
(Cela peut rendre correctement le modèle deux fois).
0 votes
Fonctionne en temps O(n)...
Mustache.render('{{#list}}{{index}}{{/list}}', { list: ['a', 'b', 'c' ], index: () => (++this.i || (this.i = 0)) });