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

Добавление смещения к {{@index}} при переходе через элементы в Handlebars

Я повторяю список в Ручках с помощью встроенного помощника each. Внутри каждого блока я ссылаюсь на индекс текущего цикла {{@index}} для печати последовательного числа элемента:

<script id="list-item-template" type="text/x-handlebars-template">
    {{#each items}}
    <li class="topcoat-list__item">
        <a href="#{{@index}}">Item number {{@index}}</a>
    </li>
    {{/each}}
</script>

Это дает следующий результат:

  • Номер позиции 0
  • Пункт номер 1
  • Пункт номер 2
  • ....

Проблема в том, что я хочу отобразить смещенный индекс, который начинается с 1 вместо 0.

Я попытался выполнить вычисления по индексу типа {{@index+1}}, но это просто приводит к

Непринятая ошибка: ошибка анализа

4b9b3361

Ответ 1

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

Ниже функция регистрирует новый помощник, который просто увеличивает значение на 1:

var Handlebars = require('handlebars');

Handlebars.registerHelper("inc", function(value, options)
{
    return parseInt(value) + 1;
});

Затем вы можете использовать его в выражении дескриптора с помощью ключевого слова inc, например:

{{inc @index}}

Ответ 2

Фактический ответ: fooobar.com/questions/136926/...

Зарегистрируйте математический руль и выполните все математические операции.

app.engine('handlebars', exphbs({
  helpers:{
    // Function to do basic mathematical operation in handlebar
    math: function(lvalue, operator, rvalue) {lvalue = parseFloat(lvalue);
        rvalue = parseFloat(rvalue);
        return {
            "+": lvalue + rvalue,
            "-": lvalue - rvalue,
            "*": lvalue * rvalue,
            "/": lvalue / rvalue,
            "%": lvalue % rvalue
        }[operator];
    }
}}));
app.set('view engine', 'handlebars');

Затем вы можете непосредственно выполнить операцию в своем представлении.

    {{#each myArray}}
        <span>{{math @index "+" 1}}</span>
    {{/each}}

Ответ 3

Я считаю, что вы можете использовать...

{{math @index "+" 1}}

Ответ 4

Чтобы развернуть ответ Mobiletainment, это решение позволяет увеличить значение для передачи в качестве аргумента. Если значение не передано, используется значение по умолчанию 1.

Handlebars.registerHelper('inc', function(number, options) {
    if(typeof(number) === 'undefined' || number === null)
        return null;

    // Increment by inc parameter if it exists or just by one
    return number + (options.hash.inc || 1);
});

Внутри шаблона вы можете написать:

{{inc @index inc=2}}

Ответ 5

Я решил эту проблему для себя, добавив короткий тег script в конец моего кода руля!

Добавьте класс туда, где вы вызываете @index, а затем работает следующий код jQuery (также можно использовать с помощью vanilla JS).

<p class="create_index">
     {{@index}}
</p>
<script>
    $(".create_index").text(parseInt($(".create_index").text())+1)
</script>

изменить 4/28 -. Это изменило использование vanilla JS для лучшей обратной совместимости (т.е. IE7, 8):

<span class="create_index"></span>
<script>
    var divs = document.querySelectorAll('.create_index');
    for (var i = 0; i < divs.length; ++i) {
        divs[i].innerHTML = i + 1;
    }
</script>

document.querySelectorAll имеет большую совместимость, но также может быть document.getElementsByClassName("create_index")

Ответ 6

Библиотека handlebars-helpers имеет довольно обширную библиотеку математики в lib/math.js, включая помощник {{add a b}} общего назначения, определенный следующим образом

/**
 * Return the product of a plus b.
 *
 * @param {Number} a
 * @param {Number} b
 * @api public
 */
helpers.add = function(a, b) {
  return a + b;
};

Если вы не хотите копировать и вставлять это в свой проект, и у вас есть возможность использовать npm, вы можете получить эту зависимость следующим образом:

npm install handlebars-helpers --save

Затем вы можете зарегистрировать математические помощники следующим образом:

const handlebars = require('handlebars'),
  handlebarsHelpers = require('handlebars-helpers');

handlebarsHelpers.math({
  handlebars: handlebars
});

Ответ 7

Кидаю мое решение сюда. Счетчики CSS.

body {
  counter-reset: section;                     /* Set a counter named 'section', and its initial value is 0. */
}

h3::before {
  counter-increment: section;                 /* Increment the value of section counter by 1 */
  content: counter(section);                  /* Display the value of section counter */
}

Я застрял на этом, и это было более приятное решение по сравнению с добавлением нового помощника.

Ответ 8

Я использовал nodejs и express-handlebars в качестве движка шаблонов и столкнулся с той же проблемой. И вот как мне удалось решить.

Вы можете создать папку и файл js внутри нее, где вы можете создать свои собственные пользовательские помощники, которые будут брать индекс и возвращать его с шагом 1.

module.exports = {
    formatIndex: function(index)  {
        return index+1;
    }
}

Не забудьте зарегистрировать помощника в вашем приложении (в моем случае app.js). Я использовал экспресс-руль, поэтому я зарегистрировал помощника следующим образом:

app.engine('handlebars', exphbs({defaultLayout: 'home', helpers: { formatIndex }}));

Примечание: вы должны импортировать formatIndex перед регистрацией.

Тогда вы можете использовать его в своем представлении как:

{{#each assignments}}
     <div>{{formatIndex @index }}</div>
{{/if}}