J'ai un bug étrange que, malheureusement, je ne peux pas reproduire avec jsfiddle. J'ai commenté tout mon code (sauf les bibliothèques, etc.) à l'exception des extraits suivants. Y a-t-il quelque chose d'évident que je ne comprends pas? Des idées?
Cela fonctionne et imprime: (0,0) (0,1) (1,0) (1,1)
<div ng-repeat="i in list">
<div ng-repeat="j in list2">
<div>
({{$parent.$index}} {{$index}})
</div>
</div>
</div>
Cependant, cette partie du code indique: (0,0) (1,1) (0,0) (1,1)
<div ng-repeat="i in list">
<div ng-repeat="j in list2">
<div ng-if="1">
({{$parent.$index}} {{$index}})
</div>
</div>
</div>
Mon contrôleur est:
$scope.list = [1, 2];
$scope.list2 = [1, 2];
En effet, la directive ng-if
crée une nouvelle portée pour elle-même. Lorsque vous vous référez à $parent
, elle accède à la portée immédiate de $parent
, c'est-à-dire à la portée de l'expression de répétition interne.
Donc, si vous voulez réaliser quelque chose que vous vouliez comme auparavant, vous pouvez utiliser ceci:
<div ng-repeat="i in list">
<div ng-repeat="j in list2">
<div ng-if="1">
({{$parent.$parent.$index}} {{$parent.$index}})
</div>
</div>
</div>
si vous avez plusieurs directives internes, vous pouvez utiliser ng-init
pour stocker $index
dans une variable pour les références dans les étendues enfants.
<div ng-repeat="i in list" ng-init="outerIndex=$index">
<div ng-repeat="j in list2" ng-init="innerIndex=$index">
<div ng-if="1">
({{outerIndex}} {{innerIndex}})
</div>
</div>
</div>
Je vous suggère fortement de lire cet article sur comprendre les portées en angulaire
Au lieu d'utiliser ng-init
, vous pouvez utiliser la syntaxe (key, value)
ng-repeat
pour obtenir l'index parent.
<div ng-repeat="(iKey, i) in list">
<div ng-repeat="j in list2">
<div ng-if="1">
({{iKey}} {{$index}})
</div>
</div>
</div>
découvrez le PLUNK
ng-if crée une nouvelle portée enfant pour laquelle il est nécessaire d'ajouter $ parent . J'ai créé la propriété myname
qui indique le nom de la portée, à l'aide de laquelle vous pouvez vérifier ce qui se passe exactement.
<div ng-if="1">
({{$parent.$parent.$index}} {{$parent.$index}})
</div>
Le ng-if
introduit une autre portée, donc un $parent.
ne suffit pas.
Vous pouvez le doubler comme ceci $parent.$parent.$index
ou vous souvenir de l'index du ng-repeat
extérieur dans une variable différente via ng-init
comme ceci:
<div ng-repeat="i in list" ng-init="listIndex = $index">
<div ng-repeat="j in list2">
<div ng-if="1">
({{listIndex}} {{$index}})
</div>
</div>
</div>
Example plunker:http://plnkr.co/edit/dtaBAmkU32BCsLASLs0C?p=preview