Angularjs 在ng repeat内部使用了两次ng init,只对第一个ng init进行求值
请参阅以下代码:Angularjs 在ng repeat内部使用了两次ng init,只对第一个ng init进行求值,angularjs,angularjs-ng-repeat,ng-init,Angularjs,Angularjs Ng Repeat,Ng Init,请参阅以下代码: <tr ng-repeat="x in [].constructor(6) track by $index" ng-init="loopNumber = $index"> <td class="border-right" style="width:10%;" ng-init="day = monthOfData[7 * loopNumber]">
<tr ng-repeat="x in [].constructor(6) track by $index" ng-init="loopNumber = $index">
<td class="border-right" style="width:10%;" ng-init="day = monthOfData[7 * loopNumber]">
<p>{{day}}</p>
</td>
<td class="border-right" style="width:10%;" ng-init="day = monthOfData[7 * loopNumber+1]">
<p>{{day}}</p>
</td>
</tr>
然而,输出是:
1
1
AngularJS似乎在ng repeat中跳过了ng init的第二次使用。这是AngularJS的性能特性吗?我正在使用ng init保存对同一表达式的重新计算。这不是错误,使用
ng init
是错误的。初始化意味着设置变量的起始值,因此上次使用ng init
时,您正在初始化一个已经有值的变量,并“覆盖”已经有值的变量
更详细地说:nginit
的第一个实例设置loopNumber=0
,因为数组和索引以0开头,而不是1。然后设置day=0
——此时,html中{{day}}
的两个实例的计算结果都将为0。最后设置day=1
,因此{{day}
的输出变为1
请注意,这适用于页面中使用{{day}
的所有位置,而不仅仅是第三个nginit
后面的行。ng init
(例如对ng repeat
的特殊属性进行别名)只有少数几种适当的用法,而这不是其中之一
代码如何在没有ng init
的情况下工作的示例:
<tr ng-repeat="x in [].constructor(6) track by $index">
<td>
<p>{{ monthOfData[7 * $index] }}</p>
</td>
<td>
<p>{{ monthOfData[7 * $index + 1] }}</p>
</td>
</tr>
请注意,在第二个示例中,如何使用
ng init
来别名引用两个不同循环的$index
的两个实例。这在第一个示例中不需要,我们可以在计算表达式时直接使用$index
。第一个循环,我假设loopNumber==0
,因此7*loopNumber
的值为0,然后向其中添加1。。。。这不是角度问题,而是代码问题
<tr ng-repeat="x in [].constructor(6) track by $index">
<td>
<p>{{ monthOfData[7 * $index] }}</p>
</td>
<td>
<p>{{ monthOfData[7 * $index + 1] }}</p>
</td>
</tr>
<tr ng-repeat="x in [].constructor(6) track by $index" ng-init="loopNumber = $index">
<td ng-repeat="x in [].constructor(2) track by $index" ng-init="var = $index">
<p>{{ monthOfData[7 * loopNumber + var] }}</p>
</td>
</tr>