ng-init 在 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]">
        <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