Como acesso um item da matriz de acesso por índice no guidão?

270

Estou tentando especificar o índice de um item em uma matriz dentro de um modelo de guidão:

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

usando isso:

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

Se o exposto acima não for possível, como eu escreveria um auxiliar que poderia acessar um item spefic dentro da matriz?

lukemh
fonte

Respostas:

409

Tente o seguinte:

<ul id="luke_should_be_here">
{{people.1.name}}
</ul>
dhorrigan
fonte
26
isso não está documentado em nenhum lugar! Impressionante.
Lukemh
25
Estou recebendo Expecting 'ID'erro com o {{user.links.websites.1}} ou o {{user.links.websites.0}}
Olivier Lalonde
131
@OlivierLalonde, eu tive que usar algo parecido {{ websites.[0] }}.
30513 Matt
4
De fato, @Matt, esse não é apenas um formato de sorte, mas é um tipo de sintaxe documentada. (Veja a minha resposta.)
Arjan
5
E o último elemento de uma matriz?
winduptoy
319

A seguir, com um ponto adicional antes do índice , funciona da maneira esperada. Aqui, os colchetes são opcionais quando o índice é seguido por outra propriedade:

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

No entanto, os colchetes são necessários em:

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

No último, usar o número do índice sem colchetes teria um:

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

Como um aparte: os colchetes (também) são usados ​​para sintaxe literal de segmento , para se referir a identificadores reais (não números de índice) que de outra forma seriam inválidos. Mais detalhes em O que é um identificador válido?

(Testado com guidão na YUI.)

Atualização 2.xx

Agora você pode usar o getauxiliar para isso:

(get people index)

embora se você receber um erro sobre o índice precisar ser uma string, faça:

(get people (concat index ""))
Arjan
fonte
10
Essa deve ser a resposta, pois é mais completa que a resposta selecionada. Exigir colchetes quando o índice está no final me deixou preso por um tempo!
Modulitos 11/03/2015
isso fez o truque! obrigado ... a resposta escolhida acima disso não foi, marque-a como correta.
MarioAraya
1
A {{#with people.1}}solução funcionou para mim, usando com.github.jknack:handlebars:4.1.2.
Ferran Maylinch
21
{{#each array}}
  {{@index}}
{{/each}}
FMQB
fonte
Impressionante, esta é a resposta correta. @index fornecerá a posição na matriz.
Oscar Romero
17

Se recursos não documentados não são o seu jogo, o mesmo pode ser feito aqui:

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

Em seguida, em um modelo

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

Eu escrevi o texto acima antes de me apossar de

this.[0]

Não vejo ninguém se aproximando demais do guidão sem escrever seus próprios auxiliares.

Bret Weinraub
fonte
8

Por favor, tente isso, se você deseja buscar primeiro / último.

{{#each list}}

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

{{/each}}


{{#each list}}

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

{{/each}}
user1378423
fonte
7

Enquanto você estiver fazendo o loop em uma matriz com eache se desejar acessar outra matriz no contexto do item atual, faça o seguinte.

Aqui estão os dados de exemplo.

[
  {
    nome: 'foo',
    attr: ['boo', 'zoo']
  }
  {
    nome: 'bar',
    attr: ['distante', 'zar']
  }
]

Aqui está o guidão para obter o primeiro item da attrmatriz.

{{#cada jogador}}
  <p> {{this.name}} </p>

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

{{/cada}}

Isso produzirá

<p> foo </p>
<p> vaia </p>

<p> barra </p>
<p> longe </p>
Fatih Acet
fonte
se a matriz attr tiver um número diferente de elementos para objetos diferentes, qual será o processo para iterar através dela? por exemplo: [{name: 'foo', attr: ['boo', 'zoo']}}, {name: 'bar', attr: ['far', 'zar', 'sar]}], então como estão você vai mostrar todo o attr para todos os objetos da matriz?
Partha Roy
eu não tentar, mas eu suponho que no {{#with this.attr}} thisiria trabalhar em vez dethis.[0]
Fatih Acet
1

A sintaxe a seguir também pode ser usada se a matriz não for nomeada (apenas a matriz é passada para o modelo):

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

No meu caso, eu queria acessar uma matriz dentro de um auxiliar personalizado como esse,

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

O que não funcionou, mas a resposta sugerida por @julesbou funcionou.

Código de trabalho:

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

Espero que isto ajude! Felicidades.

Sharukh Mastan
fonte