Индекс доступа родительского ng-repeat из дочернего ng-repeat

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

Я нашел сообщение, в котором кто-то рекомендует использовать $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>

Ответ 1

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

<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

В соответствии с ng-repeat docs 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>

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

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

Ответ 3

Взгляните на мой ответ на аналогичный вопрос.
По сглаживанию $index нам не нужно писать сумасшедшие вещи, такие как $parent.$parent.$index.


Еще более элегантное решение, в котором $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

Ответ 4

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

$parent.$parent.$index

Ответ 5

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

Ответ 6

$parent не работает, если есть несколько родителей. вместо этого мы можем определить родительскую индексную переменную в 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>