¿Cómo accedo a un elemento de matriz de acceso por índice en el manillar?

270

Estoy tratando de especificar el índice de un elemento en una matriz dentro de una plantilla de manillar:

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

usando esto:

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

Si lo anterior no es posible, ¿cómo escribiría un ayudante que pudiera acceder a un elemento específico dentro de la matriz?

lukemh
fuente

Respuestas:

409

Prueba esto:

<ul id="luke_should_be_here">
{{people.1.name}}
</ul>
dhorrigan
fuente
26
¡esto no está documentado en ningún lado! Increíble.
lukemh
25
Recibo un Expecting 'ID'error con {{user.links.websites.1}} o {{user.links.websites.0}}
Olivier Lalonde
131
@ OlivierLalonde, tuve que usar algo como {{ websites.[0] }}.
Matt
44
De hecho, @Matt, ese no es solo un formato afortunado, sino que es una sintaxis documentada. (Ver mi respuesta.)
Arjan
55
¿Qué pasa con el último elemento en una matriz?
winduptoy
319

Lo siguiente, con un punto adicional antes del índice , funciona exactamente como se esperaba. Aquí, los corchetes son opcionales cuando el índice va seguido de otra propiedad:

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

Sin embargo, los corchetes son obligatorios en:

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

En el último, usar el número de índice sin los corchetes obtendría uno:

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

Como comentario adicional: los corchetes se usan (también) para la sintaxis literal de segmento , para referirse a identificadores reales (no a números de índice) que de otra manera serían inválidos. Más detalles en ¿Qué es un identificador válido?

(Probado con manillares en YUI).

2.xx Actualización

Ahora puede usar el getayudante para esto:

(get people index)

aunque si recibe un error sobre el índice que necesita ser una cadena, haga lo siguiente:

(get people (concat index ""))
Arjan
fuente
10
Esta debería ser la respuesta porque es más exhaustiva que la respuesta seleccionada. ¡Requerir corchetes cuando el índice está al final me tuvo atascado por un tiempo!
modulitos
esto hizo el truco! gracias ... la respuesta elegida arriba de esto no fue así, por favor márquela como correcta.
MarioAraya
1
La {{#with people.1}}solución funcionó para mí, usando com.github.jknack:handlebars:4.1.2.
Ferran Maylinch
21
{{#each array}}
  {{@index}}
{{/each}}
FMQB
fuente
Impresionante, esta es la respuesta correcta. @index le dará la posición en la matriz.
Oscar Romero
17

Si las características no documentadas no son su juego, lo mismo se puede lograr aquí:

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

Luego en una plantilla

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

Escribí lo anterior antes de tener

this.[0]

No puedo ver que uno llegue demasiado lejos con el manillar sin escribir sus propios ayudantes.

Bret Weinraub
fuente
8

Por favor, intente esto, si desea buscar primero / último.

{{#each list}}

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

{{/each}}


{{#each list}}

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

{{/each}}
usuario1378423
fuente
7

Mientras realiza un bucle en una matriz con eachy si desea acceder a otra matriz en el contexto del elemento actual, lo hace así.

Aquí están los datos de ejemplo.

[
  {
    nombre: 'foo',
    attr: ['boo', 'zoo']
  },
  {
    nombre: 'bar',
    attr: ['lejos', 'zar']
  }
]

Aquí está el manillar para obtener el primer elemento en la attrmatriz.

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

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

{{/cada}}

Esto dará salida

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

<p> barra </p>
<p> lejos </p>
Fatih Acet
fuente
si la matriz attr tiene un número diferente de elementos para diferentes objetos, ¿cuál será el proceso para iterar a través de ella? por ejemplo: [{name: 'foo', attr: ['boo', 'zoo']}, {name: 'bar', attr: ['far', 'zar', 'sar]}] entonces cómo están vas a mostrar todos los atributos de cada objeto de la matriz?
Partha Roy
no lo intenté pero supongo que en {{#with this.attr}} thisfuncionaría en lugar dethis.[0]
Fatih Acet
1

La siguiente sintaxis también se puede usar si la matriz no tiene nombre (solo la matriz se pasa a la plantilla):

  <ul id="luke_should_be_here">
  {{this.1.name}}
  </ul>
José
fuente
0

En mi caso, quería acceder a una matriz dentro de un asistente personalizado como este,

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

Lo que no funcionó, pero la respuesta sugerida por @julesbou funcionó.

Código de trabajo:

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

¡Espero que esto ayude! Salud.

Sharukh Mastan
fuente