【问题标题】:custom filters 10 $digest iterations reached?自定义过滤器达到 10 $digest 迭代?
【发布时间】:2016-01-05 16:42:39
【问题描述】:

我有 10 个选择列表,每个列表有超过 10 个选项,并且由于角度设置为 10 的摘要循环的最大数量而出现此错误,

在这些选择列表中,我应用了这两个自定义过滤器并导致错误:

达到 10 次 $digest() 迭代。中止

app.filter('sortFilter', function() {
    return function(items) {
        items.sort(function (item1, item2) {
          return (item1.order > item2.order ? 1 : -1);
        });
        return items;
    };
});


app.filter('removeDuplicationFilter', function() {
    return function(items, thisOption) {
        var options=[];
        angular.forEach(items, function(item) {
             if ( item.order == 0 ) {
                options.push(item);
            } else if (thisOption == item.name) {
                options.push(item);
            }
        });
        return options;
    };
});

<div ng-repeat="field in fields|sortFilter" ng-if="filterField.order">
 <select ng-model="field.name" ng-options="item.name as item.label for item in fields | removeDuplicationFilter:field.name"></select>
</div>

请指教,谢谢

更新: JS FIDDLE

【问题讨论】:

  • 您是否分别尝试了这两个过滤器?是一个导致问题还是只有组合?请尽量缩小问题范围。
  • 为我工作:jsfiddle.net/vnb8jL91/1 请更新小提琴以说明您的问题
  • @lex82 我已经用问题 jsfiddle.net/vnb8jL91/2 更新了小提琴,结果证明这是 ng-repeat 与过滤器的组合
  • 我仍然没有在你的小提琴中看到错误
  • 如果你检查元素它在控制台中,不会影响这里的功能@lex82

标签: angularjs filter angularjs-ng-repeat


【解决方案1】:

问题是您的sortFilter 修改了它应该过滤的值,即它改变了模型。这反过来又会触发另一个摘要循环并再次进行排序。您可以通过返回数组的排序副本来轻松修复它,如下所示:

myApp.filter('sortFilter', function() {
    return function(items) {
        var result = items.concat([]); // copies the array
        result.sort(function (item1, item2) {
          return (item1.order > item2.order ? 1 : -1);
        });
        return result;
    }
});

【讨论】: