【问题标题】:Angularjs - in nested ng-repeaters, how do you get index of outher repeater item within nested repeaterAngularjs - 在嵌套的 ng-repeaters 中,你如何在嵌套的中继器中获取外部中继器项的索引
【发布时间】:2014-04-04 01:53:24
【问题描述】:

如果我有嵌套的 ng-repeaters,就像这样

<div ng-repeat="outeritem in outerobject">

    <div ng-repeat="inneritem in innerobject" ng-click="function(inneritem.key, $index)"></div>

<div>

我如何从 innerobject 中继器的 ng-click 指令中的 function(inneritem.key, $index) 中的 outterobject 中继器获取 $index

更新:

我最终还是使用了这种方法,尽管下面的帖子中还提到了另外两个好的方法。

<div ng-repeat="(indexvalue, outeritem) in outerobject">

    <div ng-repeat="inneritem in innerobject" ng-click="function(inneritem.key, indexvalue)"></div>

<div>

【问题讨论】:

    标签: javascript angularjs indexing angularjs-ng-repeat


    【解决方案1】:

    如果操作正确,使用ng-init 是最可靠的方法:

    <div ng-repeat = "outerItem in outerObject" 
         ng-init = "outerIndex=$index">
    
        <div ng-repeat = "innerItem in innerObject" 
             ng-click = "expression($index, outerIndex)"></div>
    
    <div>
    

    这里ng-init 在外部ng-repeat 指令创建的外部作用域上获取$index 的值。

    您可以使用ng-init 获取正确范围内的任何值的相同方式。 因此,将ng-init 放在第二个ng-repeat 旁边的另一个答案将获取第二个中继器的索引,而不是外部的!

    通常的范围继承警告适用 - 在子范围上定义 outerIndex 的任何其他表达式都不会更改父范围之一。请改用outer.Index对象属性来避免这种影响。

    这种方法也更加健壮,因为它可以在影响$parent 范围的代码更改下生存,例如通过将内部转发器包装到任何影响范围层次结构的指令中(例如ng-repeat)。

    它也很容易测试(例如,任何使用 $parent 的代码都不是)。


    请注意,Angular official documentation for ng-init 认为这是“唯一合适的用法”:

    ngInit 唯一合适的用途是为 ngRepeat 的特殊属性设置别名,如下面的演示所示。除了这种情况,您应该在作用域上使用控制器而不是 ngInitinitialize 值。

    【讨论】:

      【解决方案2】:

      你也可以使用 ng-init 并明确设置

      <div ng-repeat="outeritem in outerobject">
      
          <div ng-init='outerindex=$index' ng-repeat="inneritem in innerobject" ng-click="function(inneritem.key, outerindex)"></div>
      
      <div>
      

      【讨论】:

      • 您认为谨慎的做法是什么?使用父级 OR 这个方法?
      • 我最终使用了@CodeHater 建议的'(indexVar, valueVar) in values'。感谢您的帮助。
      • 这样outerindex 成为内部索引,而不是外部!
      【解决方案3】:

      您可以使用$parent 访问父元素的范围。

      ng-click="function(inneritem.key, $parent.$index)"
      

      【讨论】:

      • 太棒了!谢谢!我最终在值中使用了“(indexVar,valueVar)”,这是您指向我的帖子中的一些答案。这对我来说看起来很不错。
      • 警告。使用$parent 不是一个好习惯——它破坏了封装,难以测试,你的代码在变化时不稳定——各种坏事。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多