В Handlebars, скажем, у меня есть коллекция names
, как я могу сделать
{{#each names}}
{{position}}
{{name}}
{{/each}}
где {{position}} - 1 для имени, 2 для второго имени и т.д. Нужно ли мне сохранять позицию в виде ключа в коллекции?
В Handlebars, скажем, у меня есть коллекция names
, как я могу сделать
{{#each names}}
{{position}}
{{name}}
{{/each}}
где {{position}} - 1 для имени, 2 для второго имени и т.д. Нужно ли мне сохранять позицию в виде ключа в коллекции?
Вы можете сделать это со встроенной записью Handlebars @index:
{{#each array}}
{{@index}}: {{this}}
{{/each}}
@index даст индекс (нулевой) каждого элемента в заданном массиве.
Обратите внимание, что для людей, использующих Handlebars с движком просмотра Razor, вы должны использовать индекс нотации @@, чтобы избежать ошибок компиляции.
Дополнительные встроенные помощники см. http://handlebarsjs.com/
Handlebars.registerHelper("counter", function (index){
return index + 1;
});
Использование:
{{#each names}}
{{counter @index}}
{{name}}
{{/each}}
Пока вы не можете сделать это с помощью какого-либо собственного помощника Handlebars, вы можете создать свой собственный. Вы можете вызвать Handlebars.registerHelper()
, передав ему строку с именем, которое вы хотите сопоставить (позиция), и функцию, которая вернет текущий счет позиции. Вы можете отслеживать номер позиции в закрытии, где вы вызываете registerHelper
. Вот пример того, как вы можете зарегистрировать помощника с именем position
, который должен работать с вашим примером шаблона.
JavaScript:
// Using a self-invoking function just to illustrate the closure
(function() {
// Start at 1, name this unique to anything in this closure
var positionCounter = 1;
Handlebars.registerHelper('position', function() {
return positionCounter++;
});
// Compile/render your template here
// It will use the helper whenever it seems position
})();
Вот пример jsFiddle: http://jsfiddle.net/willslab/T5uKW/1/
В то время как помощники документируются на handlebarsjs.com, мне потребовалось некоторое время, чтобы выяснить, как их использовать. Спасибо за вызов, и я надеюсь, что это поможет!
только вы должны использовать {{@index}}
Пример:
{{#.}}
<li class="order{{@index}}"> counter: {{@index}}</li>
{{/.}}
Вот мое предпочтительное решение. Зарегистрируйте помощника, который расширяет контекст, чтобы автоматически включать ваше свойство позиции. Затем просто используйте ваш новый вспомогательный блок (например, #iter) вместо #each.
Handlebars.registerHelper('iter', function (context, options) {
var ret = "";
for (var i = 0, j = context.length; i < j; i++) {
ret += options.fn($.extend(context[i], {position: i + 1}));
}
return ret;
});
Использование:
{{#iter names}}
{{position}}
{{name}}
{{/iter}}
адаптирован из http://rockycode.com/blog/handlebars-loop-index/
вы можете получить значение только из индекса внутри списка.
{{#each list}}
@index
{{/each}}
Это работает для меня
<td>{{@index}}</td>