Как получить доступ к элементу массива доступа по индексу в руле?

270

Я пытаюсь указать индекс элемента в массиве в шаблоне руля:

{
  people: [
    {"name":"Yehuda Katz"},
    {"name":"Luke"},
    {"name":"Naomi"}
  ]
}

используя это:

<ul id="luke_should_be_here">
{{people[1].name}}
</ul>

Если вышеописанное невозможно, как бы я написал помощника, который мог бы получить доступ к специальному элементу в массиве?

lukemh
источник

Ответы:

409

Попробуй это:

<ul id="luke_should_be_here">
{{people.1.name}}
</ul>
dhorrigan
источник
26
это нигде не задокументировано! Потрясающие.
Лукем
25
Я получаю сообщение Expecting 'ID'об ошибке {{user.links.websites.1}} или {{user.links.websites.0}}
Оливье Лалонд
131
@OlivierLalonde, мне пришлось использовать что-то вроде {{ websites.[0] }}.
Мэтт
4
Действительно, @Matt, это не просто какой-то удачный формат, а своего рода документированный синтаксис. (См. Мой ответ.)
Арджан,
5
Как насчет последнего элемента в массиве?
winduptoy
319

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

{{people.[1].name}}
{{people.1.name}}

Однако квадратные скобки требуются в:

{{#with people.[1]}}
  {{name}}
{{/with}}

В последнем случае использование номера индекса без квадратных скобок даст один:

Error: Parse error on line ...:
...     {{#with people.1}}                
-----------------------^
Expecting 'ID', got 'INTEGER'

Как отступление: квадратные скобки (также) используются для синтаксического литерала сегмента , чтобы ссылаться на фактические идентификаторы (не номера индекса), которые в противном случае были бы недействительными. Подробнее в разделе Что такое действительный идентификатор?

(Проверено с помощью руля в YUI.)

Обновление 2.xx

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

(get people index)

хотя если вы получаете сообщение об ошибке, что индекс должен быть строкой, выполните:

(get people (concat index ""))
Арьян
источник
10
Это должен быть ответ, потому что он более тщательный, чем выбранный ответ. Требование квадратных скобок, когда индекс в конце, застряло на некоторое время!
модуль
это добилось цели! спасибо ... выбранный ответ выше этого не сделал, пожалуйста отметьте это как правильный.
MarioAraya
1
{{#with people.1}}Решение работает для меня, используя com.github.jknack:handlebars:4.1.2.
Ферран Мэйлинч
21
{{#each array}}
  {{@index}}
{{/each}}
FMQB
источник
Круто, это правильный ответ. @index даст вам позицию в массиве.
Оскар Ромеро
17

Если недокументированные функции не являются вашей игрой, то же самое можно сделать здесь:

Handlebars.registerHelper('index_of', function(context,ndx) {
  return context[ndx];
});

Тогда в шаблоне

{{#index_of this 1}}{{/index_of}}   

Я написал выше, прежде чем я получил

this.[0]

Я не вижу, чтобы кто-то слишком далеко зашел за руль, не написав собственных помощников

Брет Вайнрауб
источник
8

Пожалуйста, попробуйте это, если вы хотите получить первый / последний.

{{#each list}}

    {{#if @first}}
        <div class="active">
    {{else}}
        <div>
    {{/if}}

{{/each}}


{{#each list}}

    {{#if @last}}
        <div class="last-element">
    {{else}}
        <div>
    {{/if}}

{{/each}}
user1378423
источник
7

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

Вот пример данных.

[
  {
    имя: 'foo',
    attr: ['boo', 'zoo']
  },
  {
    название: «бар»,
    attr: ['far', 'zar']
  }
]

Вот руль, чтобы получить первый элемент в attrмассиве.

{{#each player}}
  <p> {{this.name}} </ p>

  {{#with this.attr}}
    <p> {{this. [0]}} </ p>
  {{/с участием}}

{{/}} Каждая

Это будет выводить

<p> foo </ p>
<p> бу </ p>

<p> бар </ p>
<p> далеко </ p>
Фатих Ацет
источник
если массив attr имеет разное количество элементов для разных объектов, то какой процесс будет проходить через него? например: [{name: 'foo', attr: ['boo', 'zoo']}, {name: 'bar', attr: ['far', 'zar', 'sar]}] тогда как Вы собираетесь показать все атрибуты для каждого объекта массива?
Партха Рой
я не пробовал, но я предполагаю, что в {{#with this.attr}} thisбудет работать вместоthis.[0]
Fatih Acet
1

Следующий синтаксис также может использоваться, если массив не назван (только массив передается в шаблон):

  <ul id="luke_should_be_here">
  {{this.1.name}}
  </ul>
Хосе
источник
0

В моем случае я хотел получить доступ к массиву внутри пользовательского помощника, например,

{{#ifCond arr.[@index] "foo" }}

Что не сработало, но ответ, предложенный @julesbou, сработал.

Рабочий код:

{{#ifCond (lookup arr @index) "" }}

Надеюсь это поможет! Приветствия.

Шарух Мастан
источник