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

Я пытаюсь указать индекс элемента в массиве в шаблоне 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>

Ответ 2

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

{{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 ""))

Ответ 3

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

Ответ 4

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

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

Затем в шаблоне

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

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

this.[0]

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

Ответ 5

Если вы хотите использовать динамические переменные

Это не сработает:

{{#each obj[key]}}
...
{{/each}}

Вам нужно сделать:

{{#each (lookup obj key)}}
...
{{/each}}

см. подменю поиска помощников руля и рулей.

Ответ 6

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

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

[
  {
    name: 'foo',
    attr: [ 'boo', 'zoo' ]
  },
  {
    name: 'bar',
    attr: [ 'far', 'zar' ]
  }
]

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

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

  {{#with this.attr}}
    <p> {{this.[0]}} </p>
  {{/with}}

{{/each}}

Это приведет к выводу

<p> foo </p>
<p> boo </p>

<p> bar </p>
<p> far </p>

Ответ 7

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

{{#each list}}

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

{{/each}}


{{#each list}}

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

{{/each}}

Ответ 8

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

  <ul id="luke_should_be_here">
  {{this.1.name}}
  </ul>

Ответ 9

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

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

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

Рабочий код:

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

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