保持ng-init变量与分配的$ index同步

时间:2015-05-13 08:37:55

标签: javascript angularjs

我在两个嵌套ng-repeat中都使用了相应的$index。因此,为了便于阅读,我重新命名了#34;使用ng-init的第一个$索引(即:ng-init="backupIndex = $index")。在起点,任何人都很好,backupIndex总是等于$index

问题是,如果我从绑定到ng-repeat的集合中移除元素,则backupIndex$index不同步。

这是plunker。如何保持$indexbackupIndex同步?

2 个答案:

答案 0 :(得分:1)

如果你可以省略ng-init部分和

,你可以这样做
<ul ng-repeat="value in values">
  <span style="display: none"> {{ backupIndex = $index }}</span>
  <li>backUp: <b>{{backupIndex}}</b> $index: <b>{{$index}}</b> <button ng-click="rem(backupIndex)">Remove</button></li>
</ul>

<span style="display: none"> {{ backupIndex = $index }}</span>此行会指定backupIndex $index的值,并会与$index同步

这是DEMO

<ul ng-repeat="value in values" ng-init="backupIndex = $index">

ng-init将仅首次执行,它将创建名为ng-repeat的{​​{1}}子范围变量,并为其指定值backupIndex和{ {1}}与$index不同步。

backupIndex

这是$index的{​​{1}}指令。它的作用是获取var ngInitDirective = ngDirective({ priority: 450, compile: function() { return { pre: function(scope, element, attrs) { scope.$eval(attrs.ngInit); } }; } }); 中的表达式并在当前作用域上执行表达式并返回结果。

在这种情况下:angular.js表达式为ng-init,然后在ng-init ng-init表达式为backupIndex = $indexscope.$eval(attrs.ngInit);表达式在attrs.ngInit范围内执行。这意味着此时在backupIndex = $index的范围内有一个名为backupIndex = $index的变量,其值为ng-repeat,而且就是它。

答案 1 :(得分:0)

您不需要将第一个索引重命名为backupIndex,因为每个ng-repeat都会创建一个新范围,如果您在第二个ng-repeat内,并且想要达到第一个索引,那么您需要做的就是使用

访问它
$parent.$index

DEMO:http://plnkr.co/edit/w8btAZfbGgNGLoYFCTP2?p=preview