Angularjs“;ng repeat“;反复过滤,它过滤掉整个阵列

Angularjs“;ng repeat“;反复过滤,它过滤掉整个阵列,angularjs,angularjs-ng-repeat,Angularjs,Angularjs Ng Repeat,数组变量不断增加。无论何时添加新元素,都会触发过滤器。数组过滤所有元素。因为我重复的数组包含实时数据,所以添加了连续数据。这会导致性能损失。随着阵列大小的增加,过滤器开始出现故障 ng-repeat="data in col.columnData | filter:{body:col.UIFilter.match} | filter:repostQuery(col.UIFilter.repost)

数组变量不断增加。无论何时添加新元素,都会触发过滤器。数组过滤所有元素。因为我重复的数组包含实时数据,所以添加了连续数据。这会导致性能损失。随着阵列大小的增加,过滤器开始出现故障

ng-repeat="data in col.columnData
                  | filter:{body:col.UIFilter.match}
                  | filter:repostQuery(col.UIFilter.repost)
                  | filter:mediaQuery(col.UIFilter.media)
                  | orderBy:'iPostedTime':'+'
                  | limitTo:col.columnSettingsObject.listLimit
                  track by data.id"
(数组大小>~1000}


需要做的是在应用过滤器后过滤添加的元素,而不是在添加元素时过滤整个索引。我如何才能做到这一点?

您不应该附加这么多过滤器。您也不应该在大数据集上使用过滤器,因为过滤器将为每个条目添加一个观察者

5过滤器1000入口=5000观察者=极慢

您的目标是每个站点只有200名观察者,摘要周期最多为2ms,最好的方法是在将数据插入
col.columnData
之前过滤数据。 您可以通过以下方式实现此目标:

let temp = your_original_dataset;
temp = $filter('filter')(temp, {body:col.UIFilter.match});
temp = $filter('filter')(temp, repostQuery(col.UIFilter.repost));
temp = $filter('filter')(temp, mediaQuery(col.UIFilter.media));
temp = $filter('orderBy')(temp, 'iPostedTime', '+');
temp = $filter('limitTo')(temp, col.columnSettingsObject.listLimit);
col.columnData = temp;

ng-repeat="data in col.columnData track by data.id"
当心这不是经过测试的。我不知道$filter的确切代码,只需查找一下即可。
希望这有帮助

这是一种角度方法,它倾听数组的更改,知道必须在更改时重新应用过滤器,但仍然需要整个数组。您可以将新旧元素分离到两个不同的数组中,过滤一次起始数组,并连续过滤不同数组中添加的元素。然后合并两个数组并显示不带过滤器的ng repeat。这是一个相当粗糙的方法,但它可以工作。AngularJS通常是配置框架上的约定,这是一个缺点,当某些东西不符合约定时,它必须被处理,并且通常不美观。