Індекс доступу батьківського ng-повтору від дочірнього ng-повтору


218

Я хочу використовувати індекс батьківського списку (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>

2
Здається, це працює правильно для мене. Я написав планкер, щоб показати, що він працює: plnkr.co/edit/BenCDh4NUGPPHKWGsGMr?p=preview Чи можете ви надати більш детальну інформацію?
Піран

Дякую тобі за це. Це призвело до того, що я виявив помилку в розмітці.
Coder1

@ Coder1, будь-ласка, видаліть це питання.
Марк Райкок

7
@MarkRajcok Я вважав це минулої ночі, але думав, що це буде корисно для інших, хто шукає, як це зробити, тому я залишив це.
Coder1

2
Добре, якщо ви хочете зберегти його, додайте відповідь і прийміть її (щоб це питання не залишалося у списку "без відповіді").
Марк Райкок

Відповіді:


279

Мій приклад код був правильним, і проблема була чимось іншим у моєму фактичному коді. Але я знаю, що було важко знайти приклади цього, тому я відповідаю на це, якщо хтось інший шукає.

<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
Також- це кинуло мене на деякий час. Якщо у вашому коді є директива ng-switch, вам потрібно буде підняти додатковий рівень області ($ parent. $ Parent. $ Index). Не дуже, я знаю.
Hairgami_Master

Домовились. Мені потрібно було передати $ parent. $ Parent. $ Index до функції мого контролера, щоб отримати правильне значення, але потім прив’язати своє ng-show до $ parent. $ Index. Мені здається, кутова помилка
Ендрю Грей

Чи можу я зробити щось подібне, якщо у мене є одне повторення колекції разом із ng-повтором? Мабуть, воно повертається невизначеним, роблячи те саме
Ali Sadiq

6
Просто додати - вам потрібен додатковий $ батько, навіть якщо у вас є ng-ifкод, як я щойно дізнався.
Plasty Grove

@PlastyGrove Дякую за вказівку, що ng-ifвимагає та додаткових $parentпосилань. Врятував мені якийсь головний біль.
iiminov

219

Згідно з документами ng-повторів 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.


Я не розумію Примітку. Чи не вся суть цього питання, тому що це неправда?
adam-beck

16
Це має бути підтвердженою відповіддю, оскільки вона чистіша, ніж $parent.$indexодна
лютого

1
@ Адам-Бек Я думаю , що вони мали в виду , що при використанні цього (fIndex, f)методу, по- , як і раніше буде визначатися $ індексу (не опущені) - тому індекс стає доступним , як і $indexі fIndex.
Самуель Йешке

1
У моєму випадку використання $indexне працює, але додавання дій fIndex. У мене немає жодної підказки щодо того, чому $index це не працює (це відбувається в інших місцях мого коду), але, боровшись протягом декількох днів, я перестав дбати, коли знайшов цю відповідь. Це також трохи легше для читання, коли у вас є кілька ng-repeatIMO.
Krøllebølle

@ Krøllebølle причина, що працює так, як ви її бачите, полягає в тому, що кожна ng-repeatітерація створює власну область, яка також визначає свою власну $index, перезаписуючи батьківську $index. Якщо ви включите {{$index}}праворуч над або під найпотужнішим ng-repeatелементом, ви побачите значення батьківського значення, а введення його всередині найпотаємнішого ng-repeatелемента покаже вам дитину. Використовуючи підхід у цій відповіді, просто присвоюється батьківський індекс змінній, ім'я якого ви вибрали ( fIndex), щоб вона не перезаписалась дочірньою областю.
tavnab

44

Погляньте на мою відповідь на подібне запитання .
Псевдонімом $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


3
також це безпечніше! якщо ви додасте ng-if всередині циклу, ви отримаєте $ index messed
gonzalon

Мені довелося зробити sectionIndex = $ parent. $ Index
Beanwah

Змінна не оновлюється, якщо ви видалите елемент, який був у масиві повторів. $ index та $ parent. $ index - завжди безпечний вибір
Bharath Bhandarkar

12

Ви також можете отримати контроль над батьківським індексом за наступним кодом

$parent.$parent.$index

1
Це добре працює для мого проекту. Дякуємо за надання приголомшливого рішення!
Canet Robern

Це, мабуть, не розширюється.
Ганеш Велланкі

На жаль, це є чимось прикладом заздрості до зображень та, очевидно, проблематичним у багатьох випадках.
ChiefTwoPencils

2

Ви можете просто використовувати використання $ parent. $ Index. Where parent представлятиме об’єкт батьківського об'єкта, що повторюється.


0

$ батько не працює, якщо є кілька батьків. замість цього ми можемо визначити батьківську індексну змінну в 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>

див. відповідь від вукалура тут він також згадує про це. Взагалі це правильний спосіб перейти до IMO і, як правило, лише правильне використання для ng-init. У будь-який час, коли люди досягають до $ батьків, ви просите про проблеми, коли контекст вашого коду змінюється.
shaunhusain
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.