$ timeout或$ apply导致在自定义过滤器中使用无限循环

时间:2015-11-09 15:07:55

标签: javascript angularjs

我尝试为大型数据集创建过滤器操作的进度条。 但是,当我尝试使用$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

1 个答案:

答案 0 :(得分:1)

非常简单:

  • 摘要称为
  • 检查值是否更改 - angular启动过滤器。
  • 您的过滤器调用$apply
  • $ apply开始新的摘要。
  • 检查值是否更改 - angular启动过滤器。
  • ...

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

请记住,javascript只有一个帖子,当javascript工作时,用户无法在浏览器中执行任何操作。