我有一个奇怪的错误,不幸的是,我不能用jsfiddle复制。除了下面的代码片段,我已经注释掉了我的整个代码(除了库等)。有什么明显的东西我不明白吗?有什么想法吗?
这适用于并打印:(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>
然而,这段代码打印:(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>
我的控制器是:
$scope.list = [1, 2];
$scope.list2 = [1, 2];
答案 0 :(得分:68)
<强> DEMO FIDDLE 强>
这是因为指令ng-if
为自己创建了一个新的范围,当你引用$parent
时,它会访问直接$parent
的范围,即内部重复表达式的范围。
因此,如果你想在前者中实现你想要的东西,你可以使用它:
<div ng-repeat="i in list">
<div ng-repeat="j in list2">
<div ng-if="1">
({{$parent.$parent.$index}} {{$parent.$index}})
</div>
</div>
</div>
如果您有多个内部指令,则可以使用ng-init
将$index
存储在子范围内的引用变量中。
<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>
上阅读这篇文章
答案 1 :(得分:16)
您可以使用ng-init
(key, value)
语法来获取父索引,而不是使用ng-repeat
。
<强> DEMO 强>
<div ng-repeat="(iKey, i) in list">
<div ng-repeat="j in list2">
<div ng-if="1">
({{iKey}} {{$index}})
</div>
</div>
</div>
答案 2 :(得分:1)
查看PLUNK
ng-if正在创建一个新的子范围,因此需要添加$ parent。
我创建了myname
属性,告诉范围名称,您可以使用它来查看确切发生的事情。
<div ng-if="1">
({{$parent.$parent.$index}} {{$parent.$index}})
</div>
答案 3 :(得分:0)
ng-if
引入了另一个范围,因此一个$parent.
还不够。
你可以像$parent.$parent.$index
一样加倍,或者通过ng-repeat
记住另一个变量中的外ng-init
的索引,如下所示:
<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>
示例plunker: http://plnkr.co/edit/dtaBAmkU32BCsLASLs0C?p=preview