J'ai donc un ng-repeat imbriqué dans un autre ng-repeat afin de construire un menu de navigation. Sur chaque <li>
de la boucle ng-repeat interne, je règle un clic-ng qui appelle le contrôleur approprié pour cet élément de menu en transmettant l'index $ afin d'indiquer à l'application laquelle il nous faut. Cependant, je dois également passer l'index $ de la commande de répétition externe pour que l'application sache dans quelle section nous nous trouvons, ainsi que dans quel tutoriel.
<ul ng-repeat="section in sections">
<li class="section_title {{section.active}}" >
{{section.name}}
</li>
<ul>
<li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu($index)" ng-repeat="tutorial in section.tutorials">
{{tutorial.name}}
</li>
</ul>
</ul>
voici un Plunker http://plnkr.co/edit/bJUhI9oGEQIql9tahIJN?p=preview
Chaque ng-repeat crée une étendue enfant avec les données transmises et ajoute également une variable supplémentaire $index
dans cette étendue.
Donc, ce que vous devez faire est d’atteindre la portée parente et d’utiliser $index
.
Voir http://plnkr.co/edit/FvVhirpoOF8TYnIVygE6?p=preview
<li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu($parent.$index)" ng-repeat="tutorial in section.tutorials">
{{tutorial.name}}
</li>
Une solution beaucoup 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>
_
Qu'en est-il de l'utilisation de cette syntaxe (jetez un coup d'œil à ceci plunker ). Je viens de découvrir cela et c'est assez génial.
ng-repeat="(key,value) in data"
Exemple:
<div ng-repeat="(indexX,object) in data">
<div ng-repeat="(indexY,value) in object">
{{indexX}} - {{indexY}} - {{value}}
</div>
</div>
Avec cette syntaxe, vous pouvez donner votre propre nom à $index
et différencier les deux index.
Juste pour aider quelqu'un qui arrive ici ... Vous ne devriez pas utiliser $ parent. $ Index car ce n'est pas vraiment sûr. Si vous ajoutez un ng-if dans la boucle, vous obtenez le $ index foiré!
Bonne manière
<table>
<tr ng-repeat="row in rows track by $index" ng-init="rowIndex = $index">
<td ng-repeat="column in columns track by $index" ng-init="columnIndex = $index">
<b ng-if="rowIndex == columnIndex">[{{rowIndex}} - {{columnIndex}}]</b>
<small ng-if="rowIndex != columnIndex">[{{rowIndex}} - {{columnIndex}}]</small>
</td>
</tr>
</table>
Vérifier: plnkr.co/52oIhLfeXXI9ZAynTuAJ
Lorsque vous traitez avec des objets, vous voulez ignorer les identifiants simples autant que cela vous convient.
Si vous changez la ligne de clic en cela, je pense que vous serez bien sur votre chemin:
<li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu(tutorial)" ng-repeat="tutorial in section.tutorials">
Aussi, je pense que vous devrez peut-être changer
class="tutorial_title {{tutorial.active}}"
à quelque chose comme
ng-class="tutorial_title {{tutorial.active}}"
Voir http://docs.angularjs.org/misc/faq et recherchez ng-class.
Il suffit d'utiliser ng-repeat="(sectionIndex, section) in sections"
et ce sera utilisable au prochain niveau ng-repeat down.
<ul ng-repeat="(sectionIndex, section) in sections">
<li class="section_title {{section.active}}" >
{{section.name}}
</li>
<ul>
<li ng-repeat="tutorial in section.tutorials">
{{tutorial.name}}, Your section index is {{sectionIndex}}
</li>
</ul>
</ul>