【问题标题】:Angularjs ng-repeat with datepicker filter executing many timesAngularjs ng-repeat 与 datepicker 过滤器执行多次
【发布时间】:2017-05-01 19:07:32
【问题描述】:

我终于设法让我的日期过滤器工作了,但现在我遇到了问题......

我有一个应该按名称和日期过滤的简单表格。它过滤正确,但日期过滤器非常慢。在调试和研究之后,我知道问题是我的自定义日期范围(从 - 到)过滤器被多次调用。 它被称为:

  1. 当我点击日历选择日期但在实际显示日历控件之前
  2. 显示日历后立即
  3. 选择日期后

如果我在打开日历后没有选择任何日期,它甚至会运行前 2 次。每次我从一个月更改为另一个月时,它也会运行。

此外,对于这 3 次调用过滤器的每一次,它也会为列表中的每一行运行一次。在示例中,我只有 10 行(实际上很快),但在我的应用程序中,它有更多,而且需要很长时间。

理想的情况是在选择日期后只调用一次此代码。

为简单起见,我在这里展示了几行代码,但您可以在 Plunker 上查看整个示例:

HTML 代码:

<!-- This is the datepicker control filter -->
<ng-datepicker ng-model="DateRegisteredFrom" view-format="MM/DD/YYYY" placeholder="mm/dd/yyyy"></ng-datepicker>

<!-- Here is the table  -->
<tr ng-repeat="item in model.People | filter:searchText | dateRegisteredFilter:DateRegisteredFrom:DateRegisteredTo | orderBy:orderByField:reverseSort ">
</tr>

这是我的 javascript 代码:

.filter("dateRegisteredFilter", function($filter, $rootScope) {
    return function(items, from, to) {
       return $filter('filter')(items, "DateRegistered", function(v) {

           // Filter code...

      });
   };
});

经过大量阅读和研究,我学到了两件事:

  1. 由于 Angular 完成“脏检查”,我的代码被多次调用(感谢这个答案:ng-repeat execute many times

  2. 实际比较日期很慢(如果代码只执行一次但不多的话就可以了)

如果有人能指出我正确的方向,或者我在阅读时做错了什么,我将不胜感激,我只找到了发生这种情况的原因,但我找不到解决方案或建议。

【问题讨论】:

    标签: angularjs filter datepicker angularjs-ng-repeat


    【解决方案1】:

    我认为您需要更改处理 ng-repeat 的方式。如您所知,这些过滤器一直在运行,因此会导致运行缓慢。您应该做的是在您的控制器中单独转换 model.People 中的数据,而不是通过多个过滤器将其管道化。这样做,您可以更好地控制过滤完成的时间和地点。

    此链接有一个很酷的 gif,有助于说明为什么事情如此缓慢https://medium.com/@lightingbeetle/some-best-practices-when-building-a-large-angular-application-c346734a4e9c

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-26
      • 1970-01-01
      • 1970-01-01
      • 2016-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-20
      相关资源
      最近更新 更多