Accedi all'indice del genitore ng-repeat dal figlio ng-repeat


218

Voglio usare l'indice dell'elenco parent (foos) come argomento per una chiamata di funzione nell'elenco child (foos.bars).

Ho trovato un post in cui qualcuno consiglia di utilizzare $ parent. $ Index, ma $indexnon è una proprietà di $parent.

Come posso accedere all'indice del genitore 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>

2
Sembra funzionare correttamente per me. Ho scritto un plunker per dimostrarlo funzionare: plnkr.co/edit/BenCDh4NUGPPHKWGsGMr?p=preview Puoi fornire maggiori dettagli?
Pirano,

Grazie per questo. Mi ha portato a scoprire che il mio problema era un bug nel mio markup.
Coder1,

@ Coder1, ti preghiamo di considerare di eliminare questa domanda.
Mark Rajcok,

7
@MarkRajcok L'ho preso in considerazione ieri sera, ma ho pensato che sarebbe stato utile per gli altri alla ricerca di come farlo, quindi l'ho lasciato.
Coder1,

2
Bene, se vuoi mantenerlo, aggiungi una risposta e accettala (quindi questa domanda non rimane nella lista "senza risposta").
Mark Rajcok,

Risposte:


279

Il mio codice di esempio era corretto e il problema era qualcos'altro nel mio codice attuale. Tuttavia, so che è stato difficile trovare esempi di questo, quindi rispondo nel caso in cui qualcun altro lo stia guardando.

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

13
Inoltre, questo mi ha gettato per un po '. Se nel tuo codice è presente una direttiva data-ng-switch, dovrai salire di livello aggiuntivo ($ parent. $ Parent. $ Index). Non carino, lo so.
Hairgami_Master

Concordato. Avevo bisogno di passare $ parent. $ Parent. $ Index alla mia funzione controller per ottenere il valore corretto ma poi associare il mio ng-show a $ parent. $ Index. Mi sembra un insetto angolare
Andrew Grey,

Posso fare una cosa del genere se ho una ripetizione Collection insieme a ng-repeat? Apparentemente sta tornando indefinito facendo lo stesso
Ali Sadiq

6
Solo per aggiungere - hai bisogno di un $ parent aggiuntivo anche se ne hai uno ng-ifnel codice come ho appena scoperto.
Plasty Grove,

@PlastyGrove Grazie per averci segnalato che ng-ifrichiede e un $parentriferimento aggiuntivo . Mi ha salvato un po 'di mal di testa.
iiminov,

219

Secondo i documenti ng-repeat http://docs.angularjs.org/api/ng.directive:ngRepeat , è possibile memorizzare l'indice della chiave o dell'array nella variabile di propria scelta.(indexVar, valueVar) in values

così puoi scrivere

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

Un livello su è ancora abbastanza pulito con $ parent. $ Index ma diversi genitori su, le cose possono diventare confuse.

Nota: $indexcontinuerà ad essere definito per ogni ambito, non è sostituito da fIndex.


Non capisco la nota. Non è tutto il punto di questa domanda perché non è vero?
Adam-Beck,

16
Questa dovrebbe essere la risposta convalidata in quanto più pulita di $parent.$indexquella
tdebroc

1
@ adam-Beck penso che significa che quando si utilizza questo (fIndex, f)metodo, $ index verrà comunque definito (non omesso) - quindi l'indice diventa accessibile sia come $indexe fIndex.
Samuel Jaeschke,

1
Nel mio caso, l'utilizzo $indexnon funziona, ma aggiungendo lo fIndexfa. Non ho un solo indizio sul perché $index non funzioni (funziona in altri punti del mio codice), ma dopo aver lottato per diversi giorni ho smesso di preoccuparmi quando ho trovato questa risposta. È anche un po 'più leggibile quando hai più ng-repeatIMO.
Krøllebølle,

@ Krøllebølle il motivo per cui funziona nel modo in cui lo vedi è che ogni ng-repeatiterazione crea il proprio ambito, che definisce anche il proprio $index, sovrascrivendo quello del genitore $index. Se includi un {{$index}}diritto sopra o sotto l' ng-repeatelemento più interno , vedrai il valore del genitore, e inserendolo all'interno ng-repeatdell'elemento più interno mostrerai quello del bambino. L'uso dell'approccio in questa risposta assegna semplicemente l'indice genitore a una variabile il cui nome è stato scelto ( fIndex) in modo che non venga sovrascritto da un ambito figlio.
Tavnab,

44

Dai un'occhiata alla mia risposta a una domanda simile .
Aliasing $indexnon dobbiamo scrivere cose folli come $parent.$parent.$index.


In modo molto più elegante soluzione che $parent.$indexsta usando 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


3
inoltre è più sicuro! se aggiungi un ng-if all'interno del ciclo, ottieni l'indice $ incasinato, controlla: plnkr.co/52oIhLfeXXI9ZAynTuAJ
gonzalon

Ho dovuto fare sectionIndex = $ parent. $ Index
Beanwah

La variabile non viene aggiornata se si elimina un elemento che si trovava nella matrice di ripetizione. $ index e $ parent. $ index è sempre la scelta sicura
Bharath Bhandarkar

12

Puoi anche ottenere il controllo dell'indice nonno tramite il seguente codice

$parent.$parent.$index

1
Questo funziona bene per il mio progetto. Grazie per aver fornito una soluzione fantastica!
Canet Robern,

Questo non è estensibile, a quanto pare.
Ganesh Vellanki,

Sfortunatamente, questo è in qualche modo un esempio di invidia delle funzionalità e ovviamente molti problemi.
ChiefTwoPencils

2

Puoi semplicemente usare usa $ parent. $ Index .where parent rappresenterà l'oggetto dell'oggetto parent che si ripete.


0

$ parent non funziona se ci sono più genitori. invece di ciò possiamo definire una variabile indice genitore in init e usarla

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

vedi la risposta di Vucalur qui menziona anche questo. In generale, questo è il modo corretto di utilizzare l'IMO e generalmente solo l'uso corretto di ng-init. Ogni volta che le persone raggiungono fino a $ parent, stai chiedendo problemi quando cambia il contesto del tuo codice.
Shaunhusain,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.