问题描述
我的html视图上有一个ng-repeat。每当用户选中一个复选框时,就会填充它重复的数组。它的工作方式类似于过滤器。
但是,我遇到了性能问题。似乎再次创建了DOM元素,因此在将结果再次填充到用户界面之前,存在1-1.5秒的“冻结”延迟。
它要重复的数组没有那么大-大约50-60个条目。数组中的每个条目都有两个对象,它们确实具有很多属性。这会影响性能吗?从我阅读的内容来看,这似乎是因为它再次在创建DOM元素。
我尝试使用$ index跟踪,这可以大大加快跟踪速度,但是这会在我显示的div框上引起问题。文字显示错误的结果,变得混乱等。我也尝试使用track by($ index + item)。没有运气-同样的问题。我也尝试使用track by item.id-但这与不使用track by具有相同的效果-缓慢。
我可以做些什么来优化它吗?还是我只是硬着头皮?
以下是我的代码:
<div ng-if="$ctrl.hasDataProcessed() && $ctrl.resultsAvailable()">
<div class="acca-builder-content">
<div class="acca-builder-header" style="border: 1px solid #1393ED;">{{"RESULTS" | translate}} ({{$ctrl.accaBuilderResultsCount}})</div>
<ul class="tips-list-group-matches">
<li ng-repeat="result in $ctrl.accaBuilderResults | orderBy: $ctrl.getSort" ng-class="{'match-has-link': $ctrl.canViewMatch(result.match)}" class="tip-list-group-match">
<tf-competition-header ng-if="result.match.CompMasterID" competition="result.match"></tf-competition-header>
<match-header match="result.match" tracking-screen="Tips"></match-header>
</li>
</ul>
</div>
</div>
</div>
在控制器内:
var buildAccaResultsFromFilter = function () {
var results = [];
var tips = ctrl.tips;
for (var i = 0; i < tips.length; i++) {
var tip = tips[i];
if(valueInFilter("COMPETITIONS",tip.match.CompID) &&
valueInFilter("DATES",tip.match.MatchDateConverted) &&
valueInFilter("SHOW",tip.tip.TipType)) {
results.push(tip);
}
}
if(results.length > 0) {
ctrl.accaBuilderResults = results;
ctrl.accaBuilderResultsCount = results.length;
ctrl.resultsFound = true;
} else {
clearaccaBuilderResults();
ctrl.resultsFound = false;
}
};
// Function called when a checkBox is clicked
ctrl.onCheckBoxChange = function (option,item) {
item.checkState = !item.checkState;
if(item.checkState) {
addToFilter(option.optionKey,item.textKey);
}
else {
removeFromFilter(option.optionKey,item.textKey);
}
if(option.onChange) {
option.onChange(item.checkState,item.checkId);
}
if(ctrl.canBuildAccaResults()) {
buildAccaResultsFromFilter();
} else {
clearaccaBuilderResults();
}
};
// Checks if a value is present within the filter by it's key
var valueInFilter = function (filterKey,value) {
return ctrl.filter[filterKey].includes(value);
};
ctrl.resultsAvailable = function () {
return ctrl.accaBuilderResults && ctrl.accaBuilderResults.length > 0;
};
ctrl.hasDataProcessed = function () {
return ctrl.tips && ctrl.competitions;
};
解决方法
没有看到一些代码,很难进行优化。
您可以尝试消除任何ng-show和ng-hide并仅使用ng-if。如果有的话,它将删除很多观察者。
此外,如果您不需要双向绑定,则可以在指令中使用以下语法。这也会删除观察者。您可以在ng-repeat中删除的观察者越多,越好。
{{:: expression }}