【发布时间】:2017-09-05 20:35:36
【问题描述】:
我遇到了运行 Angular 1.5.9 的旧版应用程序的问题。控制器包含以下循环,该循环由页面上的“全选”链接触发:
var len = $scope.payments.length, i;
for (i = 0; i < len; i++) {
$scope.payments[i].selected = true;
}
支付数组中对象中的 selected 属性绑定到视图中的复选框:
<tr data-ng-repeat="payment in payments | orderBy: 'payDate'">
<td><input type="checkbox" data-ng-model="payment.selected" data-ng-change="setSelectedTotal()"/>...
表格中的数组/行中最多有 15000 个项目,在页面加载后第一次单击“全选”链接时,在选中所有复选框的情况下刷新视图最多需要 40 秒。如果我清除复选框,然后再次单击全选链接,复选框会在大约 1 秒或更短的时间内显示为选中状态。在所有后续单击“全选”链接时都是如此——它只是第一次很慢,但之后每次都需要一秒钟或更短的时间。我怀疑这与模型绑定有关,因为当我用 console.time() 和 console.timeEnd() 包围循环时,即使第一次尝试,循环也只需要几毫秒。所以问题在于循环完成后发生的事情。我尝试从 ng-model 切换到 ng-checked 只是为了看看它是否会加快速度,但它给了我一个错误,实际上该应用程序取决于绑定到所选属性的复选框。我还尝试在页面加载的前一千个复选框上运行全选(然后是全部清除),但这没有任何区别。任何关于第一次为什么这么慢和/或如何加快速度的见解将不胜感激。
【问题讨论】:
-
通过 $index 进行跟踪是否会提高性能?
-
如果你删除 orderBy 会有明显的不同吗?
-
顺便说一句,看看您是否可以使用简化模型的 plunker 重现它会很好,它还可以帮助其他人看到问题并修复。
-
致@ABOS 评论.. 在将项目绑定到范围之前尝试对其进行排序。您还可以尝试一种分页策略,将实际数组的一个子集支付给它,并使用一个按钮(下一页)来选择下一个支付子集。
-
我猜缓慢是由于 Angular 第一次实际渲染 dom,但后来,它只是更新它
标签: javascript angularjs checkbox