219 votes

Accès à l'index du ng-repeat parent à partir du ng-repeat enfant

Je souhaite utiliser l'index de la liste parentale (foos) comme argument d'un appel de fonction dans la liste enfant (foos.bars).

J'ai trouvé un post où quelqu'un recommande d'utiliser $parent.$index, mais $index n'est pas une propriété de $parent .

Comment puis-je accéder à l'index du 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 votes

Cela semble fonctionner correctement pour moi. J'ai écrit un plunker pour montrer qu'il fonctionne : plnkr.co/edit/BenCDh4NUGPPHKWGsGMr?p=preview Pouvez-vous nous donner plus de détails ?

0 votes

Je vous en remercie. Cela m'a permis de découvrir que mon problème était un bogue dans mon balisage.

0 votes

@Coder1, veuillez envisager de supprimer cette question.

282voto

Coder1 Points 3444

Mon code d'exemple était correct et le problème venait d'un autre élément de mon code réel. Néanmoins, je sais qu'il était difficile de trouver des exemples de ce type et je réponds donc à cette question au cas où quelqu'un d'autre chercherait.

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

Par ailleurs, j'ai été un peu déstabilisé par cette question. S'il y a une directive data-ng-switch dans votre code, vous devrez monter d'un niveau de portée supplémentaire ($parent.$parent.$index). Ce n'est pas très joli, je sais.

0 votes

Il s'agit d'un accord. Je devais passer $parent.$parent.$index à ma fonction contrôleur pour obtenir la bonne valeur mais ensuite lier mon ng-show à $parent.$index. Il me semble que c'est un bug angulaire

0 votes

Puis-je faire quelque chose comme cela si j'ai une Collection repeat avec ng-repeat ? Apparemment, cela retourne undefined en faisant la même chose.

220voto

Samuli Ulmanen Points 501

D'après la documentation ng-repeat http://docs.angularjs.org/api/ng.directive:ngRepeat vous pouvez stocker la clé ou l'index du tableau dans la variable de votre choix. (indexVar, valueVar) in values

afin que vous puissiez écrire

<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 niveau plus haut est encore assez propre avec $parent.$index, mais plusieurs parents plus haut, les choses peuvent se gâter.

Nota: $index continuera d'être défini dans chaque champ d'application, il n'est pas remplacé par fIndex .

0 votes

Je ne comprends pas la note. Le but de cette question n'est-il pas de savoir si c'est vrai ou non ?

16 votes

Cette réponse devrait être validée, car elle est plus propre que l'option $parent.$index un

1 votes

@adam-beck Je pense que c'est ce qu'ils veulent dire lorsqu'ils utilisent ceci (fIndex, f) $index sera toujours défini (et non omis) - l'index devient donc accessible à la fois en tant que $index y fIndex .

45voto

vucalur Points 1730

Jetez un coup d'œil à ma réponse à une question similaire .
En cas d'aliasing $index nous ne sommes pas obligés d'écrire des choses folles comme $parent.$parent.$index .


Une solution bien plus élégante que $parent.$index utilise 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 votes

C'est aussi plus sûr ! si vous ajoutez un ng-if à l'intérieur de la boucle, vous avez $index en désordre, vérifiez : plnkr.co/52oIhLfeXXI9ZAynTuAJ

0 votes

J'ai dû faire sectionIndex = $parent.$index

1 votes

La variable n'est pas mise à jour si vous supprimez un élément qui se trouvait dans le tableau de répétition. $index et $parent.$index est toujours le choix le plus sûr.

12voto

AkRoy Points 323

Vous pouvez également contrôler l'index grand-parent par le code suivant

$parent.$parent.$index

2voto

Vivek Panday Points 848

Vous pouvez simplement utiliser use $parent.$index .où parent représentera l'objet de l'objet répétitif parent.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X