Javascript 从子ng repeat访问父ng repeat的索引

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

我想使用父列表(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)">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>