$timeout或$apply在自定义筛选器中使用时导致无限循环



我试图为大型数据集上的筛选操作创建进度条。但当我尝试使用$rootScope.$apply$timeout时,这个过滤器会进入无限循环,我不明白为什么。当我评论出sort()过滤器工作良好。有什么想法吗?

JS:

/* SORT RESULTS BY OBJECT PROPERTY VALUE */
.filter('sortObjectBy', ['$timeout', function ($timeout) {
  var timeout
    , timeoutHandler
    ;
  timeout = function () {
    if(timeoutHandler && typeof timeoutHandler.cancel === 'function'){
      timeoutHandler.cancel();
    }
    timeoutHandler = $timeout(function () {
      /* ... */
    }, 200);
  };
  return function (data, sortBy, reverse) {
    /* ... */
    timeout();
    return sortArr;
  }
}]);

HTML:

<tb-filter-row ng-if="parentData"
               ng-repeat="fd in parentData.children | sortObjectBy: sort.sortBy: sort.desc"
               filter-data="fd"></tb-filter-row>

编辑:

我试图创建一个简单的小提琴,但它似乎也坏了:LINK

非常简单:

  • 摘要称为
  • 要检查值是否已更改,请启动过滤器
  • 您的筛选器调用$apply
  • $apply启动新的摘要
  • 要检查值是否已更改,请启动过滤器

我不认为在javascript运行时显示进度条是个好主意。无论如何,如果你想,你可以这样做,(你需要手动运行过滤器):http://plnkr.co/edit/lBHKjlT7AAJWlPpRwmGJ?p=preview

请记住,javascript只有一个线程,当javascript工作时,用户不能在浏览器中做任何事情。

最新更新