2013-02-11 5 views
202

Я хочу использовать индекс родительского списка (foos) в качестве аргумента для вызова функции в дочернем списке (foos.bars).Индекс доступа родительского ng-repeat из дочернего ng-repeat

Я нашел сообщение, где кто-то рекомендует использовать $ parent. $ Index, но $index не является собственностью $parent.

Как получить доступ к индексу родителя 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

Кажется, что работает правильно для меня. Я написал плункер, чтобы показать его работу: http://plnkr.co/edit/BenCDh4NUGPPHKWGsGMr?p=preview Можете ли вы предоставить более подробную информацию? – Piran

+0

Спасибо за это. Это привело меня к тому, что моя проблема была ошибкой в ​​моей разметке. – Coder1

+0

@ Coder1, пожалуйста, подумайте об удалении этого вопроса. –

ответ

264

Мой примерный код был верным, и проблема была что-то еще в моем фактическом коде. Тем не менее, я знаю, что было трудно найти примеры этого, поэтому я отвечаю на него, если кто-то еще смотрит.

<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

Кроме того, это меня бросило на какое-то время.Если в коде есть директива data-ng-switch, вам нужно перейти на дополнительный уровень уровня - ($ parent. $ Parent. $ Index). Не очень, я знаю. –

+0

Согласен. Мне нужно было передать $ parent. $ Parent. $ Index для моей функции контроллера, чтобы получить правильное значение, но затем привязать мое ng-show к $ parent. $ Index. Кажется, это угловая ошибка для меня –

+0

Могу ли я сделать что-то вроде этого, если у меня есть один повтор коллекции вместе с ng-repeat? Очевидно, он возвращает undefined, делая то же самое –

209

Согласно нг-повторить документы http://docs.angularjs.org/api/ng.directive:ngRepeat, вы можете хранить ключ или массива индекс в переменной вашего выбора. (indexVar, valueVar) in values

так что вы можете написать

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

Один уровень до сих пор довольно чистый с $ родителем. $ Индексных но несколько родителей вверх, все может запутаться.

Примечание: $index будет по-прежнему определяться в каждой области, он не заменяется fIndex.

+0

Я не понимаю Примечание. Разве это не вопрос этого вопроса, потому что это не так? –

+15

Это должен быть подтвержденный ответ, поскольку он чище, чем '$ parent. $ Index' one – lisztomania

+1

@ adam-beck Я думаю, что они означают, что при использовании этого метода' (fIndex, f) 'значение $ index будет по-прежнему определено (не опущено) - поэтому индекс становится доступным как как '$ index', так и' fIndex'. –

40

Посмотрите на my answer to a similar question.
На aliasing $index нам не нужно писать сумасшедшие вещи, такие как $parent.$parent.$index.


Way более элегантное решение Whan $parent.$index использует 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

+1

+1, это прямо из угловых документов – AlexFoxGill

+3

также безопаснее! если вы добавите ng-if внутри цикла, вы получите $ index messed, check: http://plnkr.co/52oIhLfeXXI9ZAynTuAJ – gonzalon

+0

Мне нужно было сделать sectionIndex = $ parent. $ index – Beanwah

2

Вы можете просто использовать использование $ родительских $ индекс .где родитель будет представлять объект родительского повторения. объект.

12

Вы также можете получить контроль над грандиозного индекса родительского следующего кодом

$parent.$parent.$index 
+0

Это хорошо работает для моего проекта. Спасибо за предоставление потрясающего решения! –

+0

Это, по-видимому, невозможно. –

-1

$ родительского не работает, если есть несколько родителей. вместо этого мы можем определить родительскую индексную переменную в init и использовать ее

<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

см. Ответ от vucalur здесь он также упоминает об этом. В общем, это правильный путь для ИМО и, как правило, только правильное использование для ng-init. Каждый раз, когда люди достигают $ parent, вы задаете проблемы, когда меняется контекст вашего кода. – shaunhusain