我有多个ngRepeats生成表内容,根据用户希望看到的视图,使用不同的ngRepeat生成表。当用户切换他们的视图,并且从DOM中删除了下面的一个并添加了另一个时,新的ngRepeat不会引用同一个pagination.filteredData数组。
示例:Main是我的控制器,使用controller as语法。

<tr ng-if="Main.tableConfig.programGranularity == 'overall'" ng-repeat="item in Main.pagination.filteredData = ( Main.data.overallData | filterByDateRange | filter: Main.tableConfig.generalSearch | orderBy: ['Date', 'Name']) | startFrom: Main.pagination.startAtIndex | limitTo: Main.pagination.pageSize">
    <td ng-repeat="column in Main.tableConfig.columnsConfig | selectColumnsByGranularity: Main.tableConfig.programGranularity">
        <span ng-if="!column.isDate" ng-bind="item[column.dataValue] | ifEmpty: 0"></span>
        <span ng-if="column.isDate" ng-bind="item[column.dataValue] | date:'MM/dd/yyyy': 'UTC' | ifEmpty: 0"></span>
    </td>
</tr>

<tr ng-if="Main.tableConfig.programGranularity == 'team'" ng-repeat="item in Main.pagination.filteredData = ( Main.data.teamData | filterByDateRange | filter: Main.tableConfig.generalSearch | orderBy: ['Date', 'Name']) | startFrom: Main.pagination.startAtIndex | limitTo: Main.pagination.pageSize">
    <td ng-repeat="column in Main.tableConfig.columnsConfig | selectColumnsByGranularity: Main.tableConfig.programGranularity">
        <span ng-if="!column.isDate" ng-bind="item[column.dataValue] | ifEmpty: 0"></span>
        <span ng-if="column.isDate" ng-bind="item[column.dataValue] | date:'MM/dd/yyyy': 'UTC' | ifEmpty: 0"></span>
    </td>
</tr>

<tr ng-if="Main.tableConfig.programGranularity == 'colleague'" ng-repeat="item in Main.pagination.filteredData = ( Main.data.parsedData | filterByDateRange | filter: Main.tableConfig.generalSearch | orderBy: ['Date', 'Name']) | startFrom: Main.pagination.startAtIndex | limitTo: Main.pagination.pageSize">
    <td ng-repeat="column in Main.tableConfig.columnsConfig | selectColumnsByGranularity: Main.tableConfig.programGranularity">
        <span ng-if="!column.isDate" ng-bind="item[column.dataValue] | ifEmpty: 0"></span>
        <span ng-if="column.isDate" ng-bind="item[column.dataValue] | date:'MM/dd/yyyy': 'UTC' | ifEmpty: 0"></span>
    </td>
</tr>

我希望每个pagination.filteredData指令都设置相同的ngRepeat数组。但是,只有第一次运行的ngRepeat会设置该值,其他ngRepeat不会再次设置该值。
我试过用ngInit初始化一个包含pagination的对象,并在我的ngRepeat中引用它。我也尝试过使用$parent.pagination.filteredData
使用AngularJS v1.5.0
我怎样才能让它工作?
https://stackoverflow.com/questions/38235907/angularjs-service-variable-not-being-set-inside-of-ngrepeat相似,但经过重新编排,与之有本质区别。但解决了同样的问题。
编辑:重构后使用controller as语法,问题仍然存在。在我看来,当我切换到另一个ngRepeat时,会创建一个新的数组和引用,而不是覆盖当前数组的值。

最佳答案

好吧,我花了一些时间整理了一个坏的,我想我理解你的问题。你说“运行的第一个ng repeat设置值”,我认为它实际上是运行的最后一个ng repeat设置值。设置这个值没有问题,问题是每次都会运行3个ng,所以它总是最后一个获胜的。
发生这种情况的原因是,对于<element ng-if="item.showMe" ng-repeat="item in Main.items"></element>的常见情况,ng repeat在ng if之前执行
也就是说,即使您的ng-if条件为false,因此<tr>不会显示,ng-repeat已经运行,并且已经设置Main.pagination.filteredData
我认为你最好的做法是把你的ng-if提升一级到<tbody>。如下所示:
demo replicating (as best I could) the code that you have provided

<table>
    <thead>
      <tr>
        <th>Name</th>
        <th>Data</th>
        <th>Date</th>
      </tr>
    </thead>
    <tbody ng-if="Main.tableConfig.programGranularity == 'overall'" >
      <tr ng-repeat="item in Main.pagination.filteredData = (Main.data.overallData | filterByDateRange | orderBy: ['date', 'name']) | startFrom: Main.pagination.startAtIndex | limitTo: Main.pagination.pageSize">
        <td ng-bind="item.name"></td>
        <td ng-bind="item.overall"></td>
        <td ng-bind="item.date"></td>
      </tr>
    </tbody>
    <tbody ng-if="Main.tableConfig.programGranularity == 'team'" >
      <tr ng-repeat="item in Main.pagination.filteredData = (Main.data.teamData | filterByDateRange | orderBy: ['date', 'name']) | startFrom: Main.pagination.startAtIndex | limitTo: Main.pagination.pageSize">
        <td ng-bind="item.name"></td>
        <td ng-bind="item.team"></td>
        <td ng-bind="item.date"></td>
      </tr>
    </tbody>
</table>

09-25 18:02