问题描述
查看以下代码:
<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>
我希望使用 {{day}} 的地方,输出类似于:
1
2
然而,输出是:
1
1
AngularJS 似乎在 ng-repeat 中跳过了 ng-init 的第二次使用。这是 AngularJS 的性能特性吗?我正在使用 ng-init 来保存重新评估相同的表达式。
解决方法
这不是错误,.pb
的这种用法是错误的。初始化意味着设置变量的起始值,因此在您最后一次使用 ng-init
时,您正在初始化一个已经有值的变量并“覆盖”已经存在的值。
更详细地说:ng-init
的第一个实例设置 ng-init
,因为数组和索引从 0 开始,而不是 1。然后您设置 loopNumber = 0
-- 在这一点上,两个实例day = 0
在您的 html 中将评估为 0。然后最后您设置 {{day}}
,因此 day = 1
的输出变为 1。
请注意,这适用于您页面中使用 {{day}}
的所有位置,而不仅仅是第三个 {{day}}
之后的行。 ng-init
只有少数几个合适的用法(例如 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>
块非常相似,我们可以像这样添加第二个循环:
td
请注意在第二个示例中如何使用 <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>
为 ng-init
的两个实例设置别名,以引用两个不同的循环。这在第一个示例中是不需要的,我们可以在评估表达式时直接使用 $index
。