Javascript 从子ng repeat访问父ng repeat的索引
我想使用父列表(foos)的索引作为子列表(foos.bar)中函数调用的参数 我发现有人建议使用$parent.$index,但Javascript 从子ng repeat访问父ng repeat的索引,javascript,angularjs,angularjs-ng-repeat,Javascript,Angularjs,Angularjs Ng Repeat,我想使用父列表(foos)的索引作为子列表(foos.bar)中函数调用的参数 我发现有人建议使用$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)">A
$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>
加点东西
我的示例代码是正确的,问题在于实际代码中的其他内容。不过,我知道很难找到这样的例子,所以我会回答这个问题,以防其他人看到
<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>
加点东西
根据ng repeat docs,您可以将键或数组索引存储在您选择的变量中<值中的代码>(indexVar,valueVar)
这样你就可以写作了
<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但是多个级别上的$parent,事情会变得一团糟
注意:$index
将继续在每个作用域中定义,它不会被fIndex
替换。请查看。通过别名
$index
我们不必编写像$parent.$parent.$index
这样疯狂的东西
更优雅的解决方案,
$parent.$index
正在使用:
-
{{section.name}}
-
{{tutorial.name}
Plunker:您可以简单地使用$parent.$index。其中parent将表示父重复对象的对象。您还可以通过以下代码控制父索引
$parent.$parent.$index
如果有多个父项,$parent不起作用。相反,我们可以在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>
加点东西
它对我来说似乎正常工作。我写了一个plunker来展示它的工作原理:你能提供更多的细节吗?谢谢你。它导致我发现我的问题是我的标记中的一个bug。请CODED1,请考虑删除这个问题。@ MalrjCok我昨晚考虑过,但认为它会帮助其他人寻找如何做到这一点,所以我离开它。嗯,如果你想保留它,请加上一个答案并接受它(所以这个问题不在“未回答”列表中)。.还有-这让我有一段时间很沮丧。如果代码中有一个data ng开关指令,则需要提升一个额外的作用域级别($parent.$parent.$index)。不漂亮,我知道。同意。我需要将$parent.$parent.$index传递给我的控制器函数,以获得正确的值,但随后将我的ng show绑定到$parent.$index。对于meCan来说,这似乎是一个角度错误。如果我有一个集合重复和ng重复,我会这样做。显然,它返回未定义,执行相同的操作必须添加-即使我刚刚发现代码中有一个ng if
,您也需要一个额外的$parent。@PlastyGrove感谢您指出ng if
需要额外的$parent
参考。省得我头疼了。我不懂这张纸条。这个问题的重点不是因为这不是真的吗?这应该是经过验证的答案,因为它比$parent.$index
one@adam-贝克:我想他们的意思是,当使用这个(fIndex,f)
方法时,仍然会定义$index(没有省略)-因此索引可以像$index
和fIndex
一样访问。在我的情况下,使用$index
不起作用,但添加fIndex
会起作用。我一点也不知道为什么$index
不起作用(它在我的代码的其他地方起作用),但经过几天的努力,当我找到这个答案时,我不再在意了。当您有多个ng repeat
s IMO时,它的可读性也会更高。@Krøllebølle它以您所看到的方式工作的原因是,每个ng repeat
迭代都会创建自己的范围,它还定义自己的$index
,覆盖父级的$index
。如果在最里面的ng repeat
-ed元素的正上方或正下方包含一个{{$index}}
,您将看到父元素的值,将其放入最里面的ng repeat
-ed元素将显示子元素的值。使用此答案中的方法,只需将父索引分配给您选择了其名称的变量(fIndex
),这样它就不会被子范围覆盖。而且更安全!如果在循环中添加ng if,则$index会出错,请检查:我必须执行sectionIndex=$parent.$index如果删除重复数组中的元素,则变量不会更新$index和$parent.$index始终是安全的选择这对我的项目很有效。感谢您提供了非常棒的解决方案!这显然是不可扩展的。不幸的是,这是一个功能嫉妒的例子,在许多情况下显然是有问题的。请参阅vucalur的答案,这里也提到了这一点。一般来说,这是正确的方式去国际海事组织和一般只有正确使用的ng init。当人们联系到$parent时,当代码的上下文发生变化时,您就是在自找麻烦。
<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>