Bagaimana cara mengakses item array akses dengan indeks di setang?

270

Saya mencoba menentukan indeks suatu item dalam array di dalam template setang:

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

menggunakan ini:

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

Jika hal di atas tidak memungkinkan, bagaimana cara saya menulis pembantu yang dapat mengakses item spefic di dalam array?

lukemh
sumber

Jawaban:

409

Coba ini:

<ul id="luke_should_be_here">
{{people.1.name}}
</ul>
dhorrigan
sumber
26
ini tidak didokumentasikan di mana pun! Luar biasa.
lukemh
25
Saya mendapatkan Expecting 'ID'kesalahan dengan {{user.links.websites.1}} atau {{user.links.websites.0}}
Olivier Lalonde
131
@ OlivierLalonde, saya harus menggunakan sesuatu seperti {{ websites.[0] }}.
Matt
4
Memang, @Matt, itu bukan hanya beberapa format yang beruntung, tetapi semacam sintaks yang didokumentasikan. (Lihat jawaban saya.)
Arjan
5
Bagaimana dengan elemen terakhir dalam array?
winduptoy
319

Berikut ini, dengan titik tambahan sebelum indeks , berfungsi seperti yang diharapkan. Di sini, tanda kurung adalah opsional ketika indeks diikuti oleh properti lain:

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

Namun, tanda kurung diperlukan dalam:

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

Dalam yang terakhir, menggunakan nomor indeks tanpa tanda kurung akan mendapatkan satu:

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

Sebagai tambahan: tanda kurung (juga) digunakan untuk sintaks segmen-literal , untuk merujuk ke pengidentifikasi yang sebenarnya (bukan nomor indeks) yang jika tidak akan valid. Lebih detail dalam Apa itu pengidentifikasi yang valid?

(Diuji dengan Setang di YUI.)

2.xx Pembaruan

Anda sekarang dapat menggunakan gethelper untuk ini:

(get people index)

meskipun jika Anda mendapatkan kesalahan tentang indeks yang harus berupa string, lakukan:

(get people (concat index ""))
Arjan
sumber
10
Ini harus menjadi jawaban karena lebih menyeluruh daripada jawaban yang dipilih. Membutuhkan tanda kurung siku saat indeks pada akhirnya membuatku macet untuk sementara waktu!
modulitos
ini berhasil! terima kasih ... jawaban yang dipilih di atas ini tidak, tandai ini sebagai yang benar.
MarioAraya
1
The {{#with people.1}}solusi bekerja untuk saya, menggunakan com.github.jknack:handlebars:4.1.2.
Ferran Maylinch
21
{{#each array}}
  {{@index}}
{{/each}}
FMQB
sumber
Luar biasa, Ini adalah jawaban yang benar. @index akan memberi Anda posisi dalam array.
Oscar Romero
17

Jika fitur tidak berdokumen bukan permainan Anda, hal yang sama dapat dilakukan di sini:

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

Kemudian di templat

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

Saya menulis di atas sebelum saya mendapatkan

this.[0]

Saya tidak bisa melihat satu terlalu jauh dengan setang tanpa menulis pembantu Anda sendiri.

Bret Weinraub
sumber
9

Jika Anda ingin menggunakan variabel dinamis

Ini tidak akan berfungsi:

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

Yang perlu Anda lakukan:

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

lihat pembantu pencarian setang dan setang subekspresi .

julesbou
sumber
8

Silakan coba ini, jika Anda ingin mengambil pertama / terakhir.

{{#each list}}

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

{{/each}}


{{#each list}}

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

{{/each}}
pengguna1378423
sumber
7

Saat Anda mengulang dalam array dengan eachdan jika Anda ingin mengakses array lain dalam konteks item saat ini Anda melakukannya seperti ini.

Berikut adalah contoh datanya.

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

Ini adalah setang untuk mendapatkan item pertama dalam attrarray.

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

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

{{/setiap}}

Ini akan menampilkan

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

<p> bar </p>
<p> jauh </p>
Fatih Acet
sumber
jika array attr memiliki jumlah elemen yang berbeda untuk objek yang berbeda maka apa yang akan menjadi proses untuk beralih melalui itu? misalnya: [{name: 'foo', attr: ['boo', 'zoo']}, {name: 'bar', attr: ['far', 'zar', 'sar]}] lalu apa kabar Anda akan menunjukkan semua attr untuk setiap objek array?
Partha Roy
saya tidak mencobanya tetapi saya berasumsi dalam {{#with this.attr}} thisakan berfungsi sebagai gantinyathis.[0]
Fatih Acet
1

Sintaks berikut juga dapat digunakan jika array tidak bernama (hanya array dilewatkan ke templat):

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

Dalam kasus saya, saya ingin mengakses array di dalam pembantu kustom seperti itu,

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

Yang tidak berhasil, tetapi jawaban yang disarankan oleh @julesbou berhasil.

Kode kerja:

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

Semoga ini membantu! Bersulang.

Sharukh Mastan
sumber