我有多个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>