Подтвердить что ты не робот

Счетчик для рулей #each

В Handlebars, скажем, у меня есть коллекция names, как я могу сделать

{{#each names}}
{{position}}
{{name}}
{{/each}}

где {{position}} - 1 для имени, 2 для второго имени и т.д. Нужно ли мне сохранять позицию в виде ключа в коллекции?

4b9b3361

Ответ 1

Вы можете сделать это со встроенной записью Handlebars @index:

{{#each array}}
  {{@index}}: {{this}}
{{/each}}

@index даст индекс (нулевой) каждого элемента в заданном массиве.

Обратите внимание, что для людей, использующих Handlebars с движком просмотра Razor, вы должны использовать индекс нотации @@, чтобы избежать ошибок компиляции.

Дополнительные встроенные помощники см. http://handlebarsjs.com/

Ответ 2

Handlebars.registerHelper("counter", function (index){
    return index + 1;
});

Использование:

{{#each names}}
    {{counter @index}}
    {{name}}
{{/each}}

Ответ 3

Пока вы не можете сделать это с помощью какого-либо собственного помощника 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, мне потребовалось некоторое время, чтобы выяснить, как их использовать. Спасибо за вызов, и я надеюсь, что это поможет!

Ответ 4

только вы должны использовать {{@index}}

Пример:

{{#.}}
<li class="order{{@index}}"> counter: {{@index}}</li>
{{/.}}

Ответ 5

Вот мое предпочтительное решение. Зарегистрируйте помощника, который расширяет контекст, чтобы автоматически включать ваше свойство позиции. Затем просто используйте ваш новый вспомогательный блок (например, #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/

Ответ 6

вы можете получить значение только из индекса внутри списка.

{{#each list}}
    @index
{{/each}}

Ответ 7

Это работает для меня

<td>{{@index}}</td>