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>