1

假设一个名为refreshList的函数调用REST API来检索包含项目的JSON数组。为什么它会提高ng-repeat性能?

$scope.refreshList = function() { 
    // assuming getting the response object from REST API (Json) here 
    $scope.items = response.data.listItems; 
} 

而在HTML侧的基本NG-重复:

<div ng-repeat="item in items track by item.id"> 

然后,我添加了一个onPullToRefresh功能,通过this directive触发,旨在引发整个列表的刷新。

$scope.onPullToRefresh = function() { 
    $scope.items = []; 
    $scope.refreshList(); 
} 

它的HTML是:

<ion-refresher on-refresh="onPullToRefresh()"> 
</ion-refresher> 

的问题是,一些拉来刷新(在滚动时顶部)可以随机崩溃的应用程序...

因此,我决定改变$scope.onPullToRefresh功能是这样的:

$scope.onPullToRefresh = function() { 
    //$scope.items = []; commenting this line, causing the potential memory leak and the crash of the app 
    $scope.refreshList(); 
} 

安装此更新,应用程序崩溃,从不任何更多的在我的iOS设备:)

但是,我不知道保持行清空数组主要区别是什么。
它是否直接影响ng-repeat指令,导致一些混乱,因为REST API的承诺会立即重新指定内容?
的确,在应用此修复之前,Xcode IDE(自cordova应用以来)指出了此错误:EXC_BAD_ACCESS

这种行为可能是什么原因?

我在指出Ionic(我正在使用的框架)已经完全使用Angular 1.2.17进行了测试,所以我使用了这个版本。

+0

当你的控制台崩溃时,你是否收到错误信息? (您可以使用Safari或Chrome进行远程调试)。另外,当你设置为'[]'时,你不是“清空数组”,而是创建一个空的新数组并将其分配给一个变量。这可能是问题的一部分。 – TheSharpieOne 2014-09-24 18:10:44

+0

控制台没有错误。它在桌面上工作良好,但在iOS上失败。 – Mik378 2014-09-27 20:44:09

回答

1

这可能不是最大的答案,因为我不是100%确定的,但我会建议它与摘要有关。

ng-repeat喜欢与一个数组一起工作,而不是在刷新之间清理掉。它的设计更多地允许您动态地添加/删除数组中的项目,并且在摘要循环中相应地更新视图。你可以做一些漂亮的动画项目被添加和带走等与此。

所以当摘要到达时,你已经放弃了它正在观看的数组,并将一个新数组放入它所拥有的内存中。

尝试将阵列中的每个项目清空,而不是清除数组$scope.items = [];,而是将其排列为.pop()

这样做对它的影响很小。否则,ng-repeat最好的“Angular”方法就是通过将新项添加到数组中并删除现在消失的所有项。

+1

而不是通过数组的'pop()'ING,你可以使用'angular.copy([],$ scope.items)''。它将保持相同的数组引用,但为你清空它。 – TheSharpieOne 2014-09-27 22:11:45