#javascript #handlebars.js
#javascript #handlebars.js
Вопрос:
Я пытаюсь указать индекс элемента в массиве в шаблоне handlebars:
{
people: [
{"name":"Yehuda Katz"},
{"name":"Luke"},
{"name":"Naomi"}
]
}
используя это:
<ul id="luke_should_be_here">
{{people[1].name}}
</ul>
Если вышеуказанное невозможно, как бы мне написать помощник, который мог бы получить доступ к специальному элементу в массиве?
Ответ №1:
Попробуйте это:
<ul id="luke_should_be_here">
{{people.1.name}}
</ul>
Комментарии:
1. Я получаю
Expecting 'ID'
ошибку с {{user.links. веб-сайты. 1}} или {{user.links. веб-сайты.0}}2. @OlivierLalonde, мне пришлось использовать что-то вроде
{{ websites.[0] }}
.3. Действительно, @Matt, это не просто какой-то удачный формат, но и своего рода документированный синтаксис. (Смотрите Мой ответ.)
4. Для ember.js мне пришлось сделать что-то вроде
people.content.1.name
5. @lukemh МНОГИЕ вещи в handlebars либо плохо документированы, либо вообще нигде не документированы. Урааа….
Ответ №2:
Следующее, с дополнительной точкой перед индексом, работает точно так, как ожидалось. Здесь квадратные скобки необязательны, когда за индексом следует другое свойство:
{{people.[1].name}}
{{people.1.name}}
Однако квадратные скобки обязательны в:
{{#with people.[1]}}
{{name}}
{{/with}}
В последнем случае использование номера индекса без квадратных скобок дало бы единицу:
Error: Parse error on line ...:
... {{#with people.1}}
-----------------------^
Expecting 'ID', got 'INTEGER'
В качестве отступа: скобки (также) используются для синтаксиса литерала сегмента, чтобы ссылаться на фактические идентификаторы (не номера индексов), которые в противном случае были бы недействительными. Подробнее в Что такое действительный идентификатор?
(Протестировано с помощью Handlebars в YUI.)
Обновление 2.xx
Теперь вы можете использовать get
помощник для этого:
(get people index)
хотя, если вы получите сообщение об ошибке о том, что индекс должен быть строкой, выполните:
(get people (concat index ""))
Комментарии:
1. Это должен быть ответ, потому что он более подробный, чем выбранный ответ. Требование квадратных скобок, когда индекс находится в конце, заставило меня на некоторое время застрять!
2. это сделало свое дело! Спасибо… выбранный выше ответ этого не сделал, пожалуйста, отметьте это как правильное.
3.
{{#with people.1}}
Решение сработало для меня, используяcom.github.jknack:handlebars:4.1.2
.4. пытаюсь найти способ настроить номер индекса, чтобы я мог сверить значение из предыдущего элемента в цикле с этим. Есть идеи?
Ответ №3:
{{#each array}}
{{@index}}
{{/each}}
Комментарии:
1. Потрясающе, это правильный ответ. @index укажет вам позицию в массиве.
2. Правильный ответ, кто-нибудь может мне помочь, как я могу напечатать индекс, начинающийся с 1. По умолчанию он начинается с 0.
Ответ №4:
Если недокументированные функции не для вас, то то же самое можно сделать здесь:
Handlebars.registerHelper('index_of', function(context,ndx) {
return context[ndx];
});
Затем в шаблоне
{{#index_of this 1}}{{/index_of}}
Я написал выше, прежде чем получил доступ к
this.[0]
Я не вижу, чтобы кто-то заходил слишком далеко с handlebars без написания собственных помощников.
Ответ №5:
Если вы хотите использовать динамические переменные
Это не сработает:
{{#each obj[key]}}
...
{{/each}}
Вам нужно сделать:
{{#each (lookup obj key)}}
...
{{/each}}
смотрите помощник по поиску в handlebars и подвыражения в handlebars.
Комментарии:
1. поиск работал здесь, даже с индексом списка из предыдущего блока :
{{lookup ../../btnPercentages @../index}}
Ответ №6:
Пожалуйста, попробуйте это, если вы хотите получить первый / последний.
{{#each list}}
{{#if @first}}
<div class="active">
{{else}}
<div>
{{/if}}
{{/each}}
{{#each list}}
{{#if @last}}
<div class="last-element">
{{else}}
<div>
{{/if}}
{{/each}}
Ответ №7:
Пока вы выполняете цикл в массиве с помощью each
и если вы хотите получить доступ к другому массиву в контексте текущего элемента, вы делаете это следующим образом.
Вот пример данных.
[ { имя: 'foo', attr: [ 'boo', 'zoo'] }, { имя: 'bar', attr: ['far', 'zar' ] } ]
Вот handlebars для получения первого элемента в attr
массиве.
{{#каждый игрок}} <p> {{this.name }} </p> {{#с помощью this.attr}} <p> {{это.[0]}} </p> {{/with}} {{/каждый}}
Это приведет к
<p> foo </p> <p> boo </p> <p> панель </p> <p> далеко </p>
Комментарии:
1. если в массиве attr разное количество элементов для разных объектов, то каким будет процесс итерации по нему? например: [ { name: ‘foo’, attr: [‘boo’, ‘zoo’] }, { name: ‘bar’, attr: [‘far’, ‘zar’, ‘sar ] } ] тогда как вы собираетесь показывать все attr для каждого объекта массива?
2. я не пробовал это, но я предполагаю, что in {{#with this.attr}}
this
будет работать вместоthis.[0]
Ответ №8:
Следующий синтаксис также может быть использован, если массив не назван (в шаблон передается только массив):
<ul id="luke_should_be_here">
{{this.1.name}}
</ul>
Ответ №9:
В моем случае я хотел получить доступ к массиву внутри пользовательского помощника следующим образом,
{{#ifCond arr.[@index] "foo" }}
Который не сработал, но ответ, предложенный @julesbou, сработал.
Рабочий код:
{{#ifCond (lookup arr @index) "" }}
Надеюсь, это поможет! Приветствия.
Комментарии:
1. как бы вы скорректировали значение индекса в этом случае? т.е. я хочу сравнить значение из index и index — 1 (не работает). Спасибо.