Indeks akses induk ng-repeat dari ng-repeat anak

218

Saya ingin menggunakan indeks daftar induk (foos) sebagai argumen untuk panggilan fungsi dalam daftar anak (foos.bars).

Saya menemukan posting di mana seseorang merekomendasikan menggunakan $ parent. $ Index, tetapi $indexbukan properti dari $parent.

Bagaimana saya bisa mengakses indeks induk ng-repeat?

<div ng-repeat="f in foos">
  <div>
    <div ng-repeat="b in foos.bars">
      <a ng-click="addSomething($parent.$index)">Add Something</a>
    </div>
  </div>
</div>
Coder1
sumber
2
Tampaknya bekerja dengan baik untuk saya. Saya telah menulis sebuah plunker untuk membuatnya berfungsi: plnkr.co/edit/BenCDh4NUGPPHKWGsGMr?p=preview Dapatkah Anda memberikan detail lebih lanjut?
Piran
Terima kasih untuk itu. Itu membuat saya menemukan masalah saya adalah bug di markup saya.
Coder1
@ Coder1, harap pertimbangkan untuk menghapus pertanyaan ini.
Mark Rajcok
7
@ MarkRajcok saya memang mempertimbangkannya tadi malam, tetapi saya pikir itu akan membantu orang lain yang mencari cara melakukan ini, jadi saya meninggalkannya.
Coder1
2
Nah, jika Anda ingin menyimpannya, silakan tambahkan jawaban dan terima (jadi pertanyaan ini tidak tetap pada daftar "tidak dijawab").
Mark Rajcok

Jawaban:

279

Contoh kode saya sudah benar dan masalahnya ada pada kode saya yang sebenarnya. Namun, saya tahu sulit untuk menemukan contoh-contoh ini sehingga saya menjawabnya kalau-kalau ada orang lain yang melihatnya.

<div ng-repeat="f in foos">
  <div>
    <div ng-repeat="b in foos.bars">
      <a ng-click="addSomething($parent.$index)">Add Something</a>
    </div>
  </div>
</div>
Coder1
sumber
13
Juga- ini melempar saya sebentar. Jika ada arahan switch data-ng dalam kode Anda, Anda harus naik tingkat lingkup tambahan- ($ parent. $ Parent. $ Index). Tidak cantik, saya tahu.
Hairgami_Master
Sepakat. Saya perlu meneruskan $ parent. $ Parent. $ Index ke fungsi controller saya untuk mendapatkan nilai yang benar tetapi kemudian mengikat pertunjukan saya ke $ parent. $ Index. Sepertinya bug sudut bagi saya
Andrew Gray
Dapatkah saya melakukan sesuatu seperti ini jika saya memiliki satu pengulangan Koleksi bersama dengan ng-repeat? Ternyata itu kembali tidak terdefinisi dengan melakukan hal yang sama
Ali Sadiq
6
Hanya untuk menambahkan - Anda memerlukan $ parent tambahan meskipun Anda memiliki ng-ifkode seperti yang baru saya ketahui .
Plasty Grove
@PlastyGrove Terima kasih telah menunjukkan bahwa ng-ifdiperlukan dan $parentreferensi tambahan . Menyelamatkan saya sakit kepala.
iiminov
219

Menurut ng-repeat docs http://docs.angularjs.org/api/ng.directive:ngRepeat , Anda dapat menyimpan indeks kunci atau array dalam variabel pilihan Anda.(indexVar, valueVar) in values

jadi kamu bisa menulis

<div ng-repeat="(fIndex, f) in foos">
  <div>
    <div ng-repeat="b in foos.bars">
      <a ng-click="addSomething(fIndex)">Add Something</a>
    </div>
  </div>
</div>

Satu level naik masih cukup bersih dengan $ parent. $ Index tetapi beberapa orangtua naik, keadaan bisa menjadi berantakan.

Catatan: $indexakan terus ditentukan pada setiap lingkup, itu tidak diganti oleh fIndex.

Samuli Ulmanen
sumber
Saya tidak mengerti Catatan. Bukankah inti dari pertanyaan ini karena itu tidak benar?
adam-beck
16
Ini harus menjadi jawaban divalidasi seperti itu lebih bersih daripada $parent.$indexsatu
tdebroc
1
@ adam-beck Saya pikir itu berarti bahwa ketika menggunakan (fIndex, f)metode ini , $ index akan tetap didefinisikan (tidak dihilangkan) - sehingga indeks menjadi dapat diakses karena keduanya $indexdan fIndex.
Samuel Jaeschke
1
Untuk kasus saya, menggunakan $indextidak berfungsi, tetapi menambahkan fIndextidak. Saya tidak memiliki petunjuk sama sekali mengapa $index tidak bekerja (itu terjadi di tempat lain dalam kode saya), tetapi setelah berjuang selama beberapa hari saya berhenti peduli ketika saya menemukan jawaban ini. Ini juga sedikit lebih mudah dibaca ketika Anda memiliki beberapa ng-repeatIMO.
Krøllebølle
@ Krøllebølle alasan kerjanya seperti yang Anda lihat adalah bahwa setiap ng-repeatiterasi membuat cakupannya sendiri, yang juga menentukan sendiri $index, menimpa milik orang tua $index. Jika Anda memasukkan {{$index}}tepat di atas atau di bawah ng-repeatelemen terdalam , Anda akan melihat nilai orangtua, dan memasukkannya ke dalam ng-repeatelemen terdalam akan menunjukkan kepada Anda anak. Menggunakan pendekatan dalam jawaban ini hanya memberikan indeks induk ke variabel yang namanya telah Anda pilih ( fIndex) sehingga tidak akan ditimpa oleh lingkup anak.
tavnab
44

Lihatlah jawaban saya untuk pertanyaan serupa .
Dengan alias $indexkita tidak perlu menulis hal-hal gila seperti $parent.$parent.$index.


Cara solusi yang lebih elegan saat $parent.$indexmenggunakan ng-init :

<ul ng-repeat="section in sections" ng-init="sectionIndex = $index">
    <li  class="section_title {{section.active}}" >
        {{section.name}}
    </li>
    <ul>
        <li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu(sectionIndex)" ng-repeat="tutorial in section.tutorials">
            {{tutorial.name}}
        </li>
    </ul>
</ul>

Plunker: http://plnkr.co/edit/knwGEnOsAWLhLieKVItS?p=info

vucalur
sumber
3
juga lebih aman! jika Anda menambahkan ng-jika di dalam loop, Anda mendapatkan $ index berantakan, periksa: plnkr.co/52oIhLfeXXI9ZAynTuAJ
gonzalon
Saya harus melakukan sectionIndex = $ parent. $ Index
Beanwah
Variabel tidak diperbarui jika Anda menghapus elemen yang ada di array berulang. $ index dan $ parent. $ index selalu merupakan pilihan yang aman
Bharath Bhandarkar
12

Anda juga bisa mendapatkan kendali atas indeks grand parent dengan kode berikut

$parent.$parent.$index
AkRoy
sumber
1
Ini bekerja dengan baik untuk proyek saya. Terima kasih telah memberikan solusi yang luar biasa!
Canet Robern
Ini tidak bisa diperluas, rupanya.
Ganesh Vellanki
Sayangnya, ini adalah contoh dari kecemburuan fitur dan banyak kasus yang jelas bermasalah.
ChiefTwoPencils
2

Anda cukup menggunakan $ parent. $ Index .di mana parent akan merepresentasikan objek dari parent repeate object.

Vivek Panday
sumber
0

$ parent tidak berfungsi jika ada banyak orangtua. alih-alih itu kita dapat mendefinisikan variabel indeks induk di init dan menggunakannya

<div data-ng-init="parentIndex = $index" ng-repeat="f in foos">
  <div>
    <div data-ng-init="childIndex = $index" ng-repeat="b in foos.bars">
      <a ng-click="addSomething(parentIndex)">Add Something</a>
    </div>
  </div>
</div>
Gajanan Prasad
sumber
lihat jawaban dari vucalur di sini juga disebutkan ini. Secara umum ini adalah cara yang benar untuk menggunakan IMO dan umumnya hanya digunakan secara tepat untuk ng-init. Setiap saat orang mencapai hingga $ parent, Anda meminta masalah ketika konteks kode Anda berubah.
shaunhusain