【问题标题】:AngularJS ng-repeat filter performance: custom filter or ng-show / hideAngularJS ng-repeat 过滤器性能:自定义过滤器或 ng-show / hide
【发布时间】:2015-02-24 16:33:26
【问题描述】:

tl;博士 在 Angular 中过滤大型列表的最佳方法是什么?


这主要是关于性能。

我有一个用 ng-repeat 列出的对象数组。将有数百到数千个项目。我现在需要根据以下任一条件过滤列表:

  • A.一个简单的属性(例如数字)
  • 乙。多个条件(某些表达式)

最好的选择:

  1. 使用自定义过滤器
  2. 使用 ng-show / ng-hide
  3. 使用 ng-if
  4. 根本不要在视图中过滤——也许使用服务 + 控制器 (?)
  5. 使用 ReactJS (?)

有关用例的详细信息:

  • 我想用 :: 一次绑定来绑定大部分对象的属性,虽然有些属性需要双向绑定(排序得分)
  • 列表将在独立于用于过滤的字段的字段上动态排序。过滤掉的项目可能不应该包含在排序中
  • 过滤需要是动态的

所以我找到了 Ben Nadel 的帖子 http://www.bennadel.com/blog/2487-filter-vs-nghide-with-ngrepeat-in-angularjs.htm,但我的问题是针对一般的标准用例。

【问题讨论】:

    标签: javascript angularjs performance sorting filtering


    【解决方案1】:

    如果您使用的是 Angular 1.3,Angular 过滤器已针对性能进行了优化。它们现在是无状态的,并且在原始数据源更改之前不会执行(或重新评估)。旧版本的 Angular 过滤器并非如此。在此处了解这些无状态过滤器http://blog.thoughtram.io/angularjs/2014/11/19/exploring-angular-1.3-stateful-filters.html

    对于旧版本,如果您可以在控制器或服务中进行过滤,并且始终将过滤后的结果绑定到视图,那就更好了。这是关于保留一个数组,例如$scope.filteredItem=[];,并在过滤条件发生变化时更新它。 您仍然可以在代码中使用角度过滤器,使用 $filter 服务。

    【讨论】:

    • 我实际上需要过滤器是有状态的,因为过滤器将依赖于服务。我想我会添加一些范围滑块并通过控制器变量将值连接到服务属性。因此,使用无状态过滤器,这是行不通的。也许还有其他方法?
    • 依赖后端服务的有状态过滤器可能是一个很大的性能杀手。对于有状态的过滤器,它们会在每个摘要循环中重新评估。最好在分配给视图之前过滤数据。
    • 它依赖的不是后端服务,而是客户端服务。
    猜你喜欢
    • 1970-01-01
    • 2013-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-06-18
    • 2016-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多