在大型数据集上使用多个过滤器进行ng-repeat

act*_*eon 41 angularjs

我还是AngularJS的新手,所以我只是想做一个简单的CRUD应用程序.目前,我$httpdiv控制器处理的情况下提取数据(在JSON文件中)MyCtrl1.

function MyCtrl1($scope, $http) {
    $http.get('data/accounts.json').success(function(data) {
        $scope.accounts = data;
    ...
    }); 
}
Run Code Online (Sandbox Code Playgroud)

这里面divtable有以下tbody:

<tbody>
    <tr ng-repeat="account in accounts | orderBy:sort.field:sort.desc | startFrom:currentPage * pageSize | limitTo:pageSize">
        <td contentEditable="true" ng-repeat="(label, value) in account" ng-show="fields[label].visible">{{value}}</td>
    </tr>
</tbody>
Run Code Online (Sandbox Code Playgroud)

orderBy根据所选择的场滤波器种类; startFrom将数组切片以从某一点开始; limitTo根据预设的页面大小过滤.没有分页过滤器,性能非常糟糕,但我很想知道是否有另一种方法可以解决这个问题?

我有Batarang for Chrome,在Performance选项卡下它显示ngRepeatWatch占用了大部分时间,我认为它与我正在进行的所有过滤有关..

nef*_*lar 72

{{表达| filter1 | filter2}}

只是用

<tr ng-repeat="account in accounts | filter1 | filter2 | filter3" >
  <td contentEditable="true" ng-repeat="(label, value) in account" ng-show="fields[label].visible">{{value}}</td>
</tr>
Run Code Online (Sandbox Code Playgroud)

Angular 2使用管道,但它看起来像过滤器:

<div>The chained hero's birthday is
<p>{{  birthday | date:'fullDate' | uppercase}}</p>
<div>
Run Code Online (Sandbox Code Playgroud)

  • 这段代码看起来非常熟悉我在问题中已经拥有的内容...... (26认同)
  • 这是filter1 AND filter2 AND filter3.可以做filter1或filter2或过滤器3 (2认同)

小智 11

我知道这个问题已经过时了,但是对于未来的任何人来说.在线过滤是昂贵的(计算上的)因为它直接在DOM上工作,如果你处理1000多行的大量数据,那么在你的控制器中过滤你的集合然后重复它就好了.


Roy*_*ove 4

我会在控制器或服务器端处理分页。我的猜测是 ng-repeat 正在观看你的整个列表,而不是只观看它需要观看的内容,这会非常慢。

  • 我将来会考虑编写一个指令,但在过滤隐藏列而不是“ng-show”它们之后,我发现 ngRepeatWatch 的速度提高了 4 倍。傻我 (2认同)