passing 2 $index values within nested ng-repeat
因此,我在另一个ng-repeat中嵌套了一个ng-repeat,以构建导航菜单。 在内部ng-repeat循环的每个
上,我设置一个ng-click,它通过传入$ index来调用该菜单项的相关控制器,以使应用知道我们需要哪个。 但是,我还需要从外部ng-repeat传递$ index,以便应用程序知道我们在哪个部分以及哪个教程中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <ul ng-repeat="section in sections">
<li class="section_title {{section.active}}">
{{section.name}}
</li>
<ul>
<li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu($index)" ng-repeat="tutorial in section.tutorials">
{{tutorial.name}}
</li>
</ul>
</ul> |
这是一个傻瓜http://plnkr.co/edit/bJUhI9oGEQIql9tahIJN?p=preview
-
为什么要通过$ index? 只需像ng-click="loadFromMenu(section)"这样传递对象引用。 传递$ index意味着您将进行循环查找不需要的对象。
每个ng-repeat都会使用传递的数据创建一个子作用域,并在该作用域中添加一个附加的$index变量。
因此,您需要做的是达到父作用域,并使用该$index。
看到http://plnkr.co/edit/FvVhirpoOF8TYnIVygE6?p=preview
1 2 3 4
| <li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu($parent.$index)" ng-repeat="tutorial in section.tutorials">
{{tutorial.name}}
</li> |
-
太棒了,这就是我访问外部$ index的方式,但是我需要同时传入$ index值。我试着将它们放在一个数组中,它起作用了:)
-
您不必使用数组:ng-click="loadFromMenu($parent.$index, $index)"
-
您甚至不必传递索引-在loadFromMenu中,它应该有权访问this对象,这将使您可以访问:this。$ index和this。$ parent。$ index
-
@Oddman即使这是可能的,我也不认为这是一个好主意,因为您然后硬连接loadFromMenu使其在具有$ index作用域和$ index父作用域的对象的上下文中运行。假设您然后例如在菜单中创建了两个在两个重要范围之间生成另一??个范围的组-您将不得不更改loadFromMenu而不是更改对其的调用。并且,如果在某些菜单中需要调用loadFromMenu($parent.$parent.$index,$index),而在某些菜单中仅需要loadFromMenu($parent.$index,$index),则使用this....将不起作用。
-
同意。通常,当我做这种事情时,我会建立特定于资源的指令,因此这不是问题。
-
如果表模型在控制器中以2D数组表示,则这对于简单表非常有效。您可以对行使用嵌套的ng-repeats。
-
+1 $ parent。$ index
-
您不应该使用$ parent。$ index,因为它并不安全。如果在循环中添加ng-if,则会使$ index混乱,请检查:plnkr.co/52oIhLfeXXI9ZAynTuAJ
-
@gonzalon那么,您有什么建议呢?
-
@Casey看看我的答案stackoverflow.com/questions/15256600/
-
使用$ parent是使用angular-ui-tree时的工作方式,其中可以将节点拖放到不同的位置。它可能很脆弱,但至少不会导致数据损坏。由于未更新索引,因此此处的其他答案会导致节点移动时数据损坏。
-
您不需要将$ index和$ parent。$ index变量传递给函数。在您的函数中,可以使用以下方式获取索引:var index = this。$ index; var parent = this。$ parent。$ index;
-
谢谢@AlexMA,祝您度过美好的一天...
比$parent.$index更优雅的解决方案是使用ng-init:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <ul ng-repeat="section in sections" ng-init="sectionIndex = $index">
<li class="section_title {{section.active}}">
{{section.name}}
</li>
<ul>
<li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu(sectionIndex)" ng-repeat="tutorial in section.tutorials">
{{tutorial.name}}
</li>
</ul>
</ul> |
Plunker:http://plnkr.co/edit/knwGEnOsAWLhLieKVItS?p=info
-
完美运行,不仅适用于函数,而且还可以作为依赖于父数据的复合ng类条件的一部分
-
这是实现此效果的推荐方法。实际上,角度小组曾几次表示这是ng-init指令的少数推荐用法之一(请参阅:链接)。我经常发现使用$ parent(根据当前接受的答案)有点代码味道,因为通常会有更好的方法实现$ scope到$ scope的通信(服务或广播/发射事件)并将其分配给命名变量可以更清楚地表示值的含义。
-
IMO这个答案比公认的要好得多。确实不建议使用$ parent。
-
这是比接受的答案更好,更优雅的解决方案(我尝试了上一个答案,并最终为我的代码添加了$ parent。$ parent。$ index-看起来很脆弱)。谢谢!
-
当您从列表中删除项目时,这会停止工作,因为ng-init值不会重新初始化。仅当您不打算从列表中删除项目时,它才有用。
-
@JesseGreathouse非常重要的一点是可以预防真正困难的错误
-
看起来像角度语法进化了。 stackoverflow.com/a/31477492/2516560,您现在可以使用" ng-repeat =(键,值)在数据中"
-
简单但比使用$ parent选择器更好,因为父项可以更改。
-
那时我写了这个答案,这就是Angular 1.X的解决方法。 ng-init的这种用法在ng-init文档中得到了证明,在ng-repeat文档中没有任何提及,因此我在这里写了+修改了Github上的文档。 @Okazari演示了当前ng-repeat语法有更好的方法来实现此目的。它没有您在评论中提到的一些缺陷。
如何使用这种语法(请看一下这个插件)。我刚刚发现了它,而且非常棒。
1
| ng-repeat="(key,value) in data" |
例:
1
| {{indexX}} - {{indexY}} - {{value}} |
使用这种语法,您可以将自己的名字命名为$index,并区分两个索引。
-
我认为当您有多个嵌套循环时,这比使用父级方法干净得多
-
实际上,这在使用angular-ui-tree拖放节点时给我带来了一些实际问题。索引似乎没有重置,结果发生了奇怪的事情。
-
@MikeTaverne您可以尝试在一个塞子中重现吗?我喜欢看到这种行为。
-
这是完成此操作并避免任何潜在问题的正确方法。 ng-init适用于初始渲染,但是如果对象在页面上更新,则会中断。
-
@Okazari如何在ng-show中使用这些条件
-
好!但请像插入代码示例一样修正添加" track by"的问题。
-
@Danilo Hey Danilo,我不会在插件中添加"跟踪依据"示例,因为使用索引作为跟踪依据的标识是一种不好的做法。您应该始终使用特定于该对象的标识符(例如ID)。由于我的示例中没有ID,因此在插件中使用" track by"只是一种解决方法。
只是为了帮助到达这里的人...您不应该使用$ parent。$ index,因为它并不真正安全。如果在循环中添加ng-if,则会使$ index混乱!
正确的路
1 2 3 4 5 6 7 8 9 10
| <table>
<tr ng-repeat="row in rows track by $index" ng-init="rowIndex = $index">
<td ng-repeat="column in columns track by $index" ng-init="columnIndex = $index">
<b ng-if="rowIndex == columnIndex">[{{rowIndex}} - {{columnIndex}}]
<small ng-if="rowIndex != columnIndex">[{{rowIndex}} - {{columnIndex}}]</small>
</td>
</tr>
</table> |
检查:plnkr.co/52oIhLfeXXI9ZAynTuAJ
-
请注意,这里不需要" track by"-这是用于ng-repeat的另一件事,用于了解唯一项并注意集合中的更改(请参阅docs.docs.angularjs.org/api中的" Tracking and Duplicates"部分/ ng / directive / ngRepeat)。这里的重点是" ng-init"-这是与角度文档一致的正确方法。
-
@gonzalon如何将这些索引作为参数传递给ng click
-
我正在做removeList($ index)或removeList(rowIndex)它没有在我收到未定义的索引值的函数中正确记录索引。我正在使用角度1.5.6
-
这是正确的方法,永远不要访问$ parent
在处理对象时,您想尽可能地忽略简单的id。
如果您将点击线更改为此,我认为您会顺利进行的:
1
| <li class="tutorial_title {{tutorial.active}}" ng-click="loadFromMenu(tutorial)" ng-repeat="tutorial in section.tutorials"> |
另外,我认为您可能需要更改
1
| class="tutorial_title {{tutorial.active}}" |
像
1
| ng-class="tutorial_title {{tutorial.active}}" |
参见http://docs.angularjs.org/misc/faq并查找ng-class。
只需使用ng-repeat="(sectionIndex, section) in sections"
并且可以在下一级ng-repeat down上使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| <ul ng-repeat="(sectionIndex, section) in sections">
<li class="section_title {{section.active}}">
{{section.name}}
</li>
<ul>
<li ng-repeat="tutorial in section.tutorials">
{{tutorial.name}}, Your section index is {{sectionIndex}}
</li>
</ul>
</ul> |