AngularJs过滤器与控制器内部过滤器的性能

时间:2016-03-23 23:59:22

标签: angularjs angularjs-filter

与标题一样,过滤ng-repeat列表的最佳方法是什么?要使用自定义(或现有).filter()还是在我的控制器中创建自定义过滤器功能?

我之所以这么说是因为多次调用.filter()(每次有一个dygest周期according to this answer)。

所以我担心性能问题。如果我有一个巨大的列表要在ng-repeat中使用并且需要对其进行过滤,那么在使用.filter()时是否会产生巨大的影响?

另一方面,当在控制器内部使用自定义过滤器功能时,我只会在需要时仅过滤列表一次。我对这部分有了更好的控制。

这是正确的逻辑吗?或者还有其他方法来优化过滤器的使用吗?

2 个答案:

答案 0 :(得分:1)

我相信你问这样的事情? (检查日志)

https://plnkr.co/edit/B0WSa11DWcCaImEoexVh?p=preview

所以就像你链接的帖子(链接到一个小提琴)一样,它在ng-filter内真正触发了两次过滤器,但如果你在控制器内进行排序,它只会被击中一次。

修改

我的建议是,如果你有一个需要分类的大型对象:

  1. 后端排序(如果可能)

  2. 使用控制器内的功能进行排序

  3. (制作一个自定义过滤器,它会在第一时间跳过过滤 并归还原件? :I)

  4. 解释滤镜的视频: http://www.bennadel.com/blog/2766-stateless-filters-don-t-apply-to-objects-arrays-or-ngrepeat-in-angularjs-1-3.htm

答案 1 :(得分:0)

实际执行此操作的最佳方法是构建"指令"。如图所示(Ill Post multiple examples。):

app.controller('MainCtrl', function($scope) {
   $scope.Items= [
       { id: 1, color: 'lightblue' },
       { id: 2, color: 'blue' }
   ];
});

div ng-repeat="item in Items| filter: { color: 'blue' }"> 

或者你可以用

来做

功能

 app.controller('MainCtrl', function($scope) {
           $scope.friends= [
               { id: 1, name: 'John' },
               { id: 2, name: 'Richard' }
           ];
           $scope.searchText= function (item) { 
               return item === 'John'; 
            }
        });



 <div ng-repeat="friend in friends | filter: searchText">

EDIT2

所以对于嵌套数组......

app.controller('MainCtrl', function($scope) {
               $scope.colors= [
                   {color:['blue','green','red']}
               ];
            });

然后你会......

<div ng-repeat="color in colors">
  <div ng-repeat="uniqueColor in color">
     {{uniqueColor}}
  </div>
</div>

在这里你甚至不需要过滤器..我喜欢称之为&#34;嵌套的ng-repeat&#34; :d

Here是一个更好的示范小提琴..

<强> EDIT3

现在过滤ng-repeat ..

<div ng-repeat="color in colors">
      <div ng-repeat="uniqueColor in color | filter: 'Blue'">
         {{uniqueColor}}
      </div>
    </div>

小提琴代表here ..

<强> EDIT4

你可以像我读的那样使用:

app.filter("filterName", function(){
  return function(obj){
   return "Apple.inc"
  }
})

Fiddle