Akses indeks $ parent di knockout.js

87

Di knockout.js 2.1.0, dalam templat yang menggunakan foreach binding, Anda dapat mengakses indeks item saat ini melalui fungsi $ index (). Dalam pengikatan foreach bersarang, apakah ada cara untuk mengakses indeks $ parent dari template?

Katakanlah saya memiliki struktur data seperti ini:

var application = {
  topModel: [
    {
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]}, // this has top:0 and sub:0
      {subModel: [{'foo2':'foo2'}, { 'bar2':'bar2'}]} // this has top:0 and sub:1
    },
    {
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]} // this is top:1 sub:0
    },
    {
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]} // this is top:2 sub:0
      {subModel: [{'foo':'foo'}, { 'bar':'bar'}]} // this is top:2 sub:1
    },
    ...
    ]};

Dengan ini, saya ingin mencetak jalur ke setiap model, menggunakan indeks: [topModel-index subModel-index], sehingga hasilnya akan seperti ini:

[0 0]
[0 1]
[1 0]
[2 0]
[2 1]
...

Saya telah mengikat model menggunakan foreach, tetapi saya tidak tahu cara mengakses indeks topModel dalam konteks subModel. Contoh berikut menunjukkan pendekatan yang telah saya coba, tetapi tidak berhasil, karena saya tidak tahu cara mengakses indeks $ parent referrer.

<!--ko foreach: topModel -->
<!--ko foreach: subModel -->
  [<span data-bind="text: $parent.index()"></span>
  <span data-bind="text: $index()"></span>]
<!--/ko-->
<!--/ko-->

Harus mencetak: 0 1, 0 2, 1 0, 1 1, 1 2, 2 0, 2 1, ...

Jørgen
sumber
Anda tidak benar-benar membutuhkannya ()setelah $indexitu.
Matthew Schinckel
Juga, jika Anda bisa membuat jsfiddle dengan apa yang Anda miliki, itu akan membuatnya lebih mudah. Atau posting sumber data Anda dan lihat kode model.
Matthew Schinckel
Untuk saat ini, saya hanya mengerjakan prototipe, jadi saya tidak memiliki lebih dari contoh yang diberikan. Saya terbuka untuk saran menggunakan pendekatan lain.
Jørgen
Mungkin menggambarkan apa yang Anda coba lakukan, daripada bagaimana . Mungkin ada pendekatan yang berbeda.
Matthew Schinckel
Terima kasih. Saya mengubah pertanyaan saya, dan semoga lebih jelas sekarang?
Jørgen

Jawaban:

186

untuk mengakses indeks penggunaan objek induk

$parentContext.$index()

daripada

$parent.index()
Brett Smith
sumber
14
Padahal, untuk menjadi terlalu eksplisit atas nama orang bebal, Anda masih harus $parentContext.$index()berurusan dengan orang tua. ; ^) Sedikit lagi tentang $ parentContext di sini , fwiw.
ruffin
@ruffin bukan untuk $ index, sesuai dengan komentar Matthew pada pertanyaan awal "Anda sebenarnya tidak membutuhkan itu () setelah $ index di sana." $ index adalah variabel khusus daripada yang dapat diamati.
Brett Smith
3
terima kasih - pasti perlu diperhatikan, dalam konteks nilai komposit Anda perlu menambahkan () namun jika Anda mengikat elemen ke $ parentContext. $ index sesuai pertanyaan Anda tidak membutuhkannya.
Brett Smith
5
Butuh tanda kurung$parentContext.$index()
Jaider
4
Hanya ingin menambahkan yang $parentContext.$parentContext.$index()berfungsi seperti yang Anda harapkan juga.
Ryan Wheale
3

Cara termudah untuk mengetahuinya adalah mengunduh "konteks knockout" untuk chrome. Ini menunjukkan kepada Anda data apa yang terikat ke elemen apa dan juga memungkinkan Anda melihat fungsi / variabel yang tersedia untuk elemen terikat tertentu. Ini adalah alat yang luar biasa untuk situasi seperti ini.

Julian
sumber