2013-02-11 19 views
202

Ich möchte den Index der Elternliste (foos) als Argument für einen Funktionsaufruf in der untergeordneten Liste (foos.bars) verwenden.Access-Index der Eltern ng-repeat von Kind ng-repeat

Ich habe einen Beitrag gefunden, in dem jemand die Verwendung von $ parent. $ Index empfiehlt, aber $index ist keine Eigenschaft von $parent.

Wie kann ich auf den Index des Elterns ng-repeat zugreifen?

<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

Es scheint für mich richtig zu funktionieren. habe ich schrieb einen Plunker es zu zeigen, arbeiten: http://plnkr.co/edit/BenCDh4NUGPPHKWGsGMr?p=preview Können Sie mehr Details zur Verfügung stellen? – Piran

+0

Vielen Dank dafür. Es führte dazu, dass mein Problem ein Fehler in meinem Markup war. – Coder1

+0

@ Coder1, bitte in Betracht ziehen, diese Frage zu löschen. –

Antwort

264

Mein Beispielcode war korrekt und das Problem war etwas anderes in meinem tatsächlichen Code. Trotzdem weiß ich, dass es schwierig war, Beispiele dafür zu finden, also beantworte ich sie, falls jemand anders hinschaut.

<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

Auch - das hat mich für eine Weile geworfen.Wenn es eine Data-ng-switch-Anweisung in Ihrem Code gibt, müssen Sie eine zusätzliche Scope-Ebene ($ parent. $ Parent. $ Index) nach oben gehen. Nicht hübsch, ich weiß. –

+0

Einverstanden. Ich musste $ parent. $ Parent. $ Index an meine Controller-Funktion übergeben, um den korrekten Wert zu erhalten, aber dann meine ng-show an $ parent. $ Index binden. Scheint wie ein kantiger Bug zu mir –

+0

Kann ich etwas tun, wenn ich eine Sammlung wiederhole zusammen mit ng-repeat? Offenbar gibt es zurück undefined macht das gleiche –

209

Nach ng-Repeat-docs http://docs.angularjs.org/api/ng.directive:ngRepeat, können Sie den Schlüssel oder Array speichern Index in den Variablen Ihrer Wahl. (indexVar, valueVar) in values

so können Sie

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

Ein Level schreiben mit $ parent noch ganz sauber ist. $ Index aber einige Eltern, können die Dinge chaotisch.

Hinweis: $index wird weiterhin bei jedem Bereich definiert, es wird nicht durch fIndex ersetzt.

+0

Ich verstehe die Note nicht. Ist das nicht der springende Punkt dieser Frage, weil das nicht wahr ist? –

+15

Dies sollte die validierte Antwort sein, da es sauberer ist als der '$ parent. $ Index' one – lisztomania

+1

@ adam-beck Ich denke, sie meinen, dass bei Verwendung dieser' (fIndex, f) 'Methode $ index immer noch definiert wird (nicht weggelassen) - so wird der Index sowohl als $ index als auch als fIndex zugänglich. –

40

Werfen Sie einen Blick auf my answer to a similar question.
Durch Aliasing $index müssen wir nicht verrückte Sachen wie $parent.$parent.$index schreiben.


Way elegantere Lösung whan $parent.$index wird ng-init mit:

<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

+1

+1, das ist direkt aus dem eckigen docs – AlexFoxGill

+3

auch es ist sicherer! Wenn Sie ein ng-if innerhalb der Schleife hinzufügen, erhalten Sie den $ Index vermessen, überprüfen Sie: http://plnkr.co/52oIhLfeXXI9ZAynTuAJ – gonzalon

+0

Ich musste sectionIndex = $ parent. $ index – Beanwah

2

Sie einfach nutzen $ parent $ index .wo Elternteil darstellen Objekt der Eltern können sich wiederholende Objekt .

12

Sie können auch

$parent.$parent.$index 
+0

Das funktioniert gut für mein Projekt. Vielen Dank für die tolle Lösung! –

+0

Dies ist anscheinend nicht erweiterbar. –

-1

$ parent durch den folgenden Code die Kontrolle über große Ausgangs-Index erhalten funktioniert nicht, wenn es mehrere Eltern sind. statt dessen können wir eine übergeordnete Indexvariable in init definieren und sie verwenden

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

siehe Antwort von Vucalur hier erwähnt es auch dies. Im Allgemeinen ist dies der richtige Weg, IMO zu gehen und generell nur für ng-init geeignet zu sein. Jedes Mal, wenn Menschen bis zu $ ​​eltern erreichen, fragen Sie nach Ärger, wenn sich der Kontext Ihres Codes ändert. – shaunhusain