¿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?

Respuestas:


409

Prueba esto:

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

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

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}}

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.



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}}

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>

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>

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.