为什么这个分组角度滤波器会导致消化循环?

时间:2013-04-23 21:56:42

标签: javascript angularjs angularjs-ng-repeat

我试图一次在N个项目的块中显示一堆项目。我需要对项目进行分块,因为标记必须是表格/网格(每组N个项目都有一行,然后是每个项目的列)。这是一个简化的尝试:

app.filter('inGroupsOf', function () {
    return function (input, groupSize) {
        if (!input) {
            return [];
        }
        var result = [];
        for (var index = 0; index < input.length; index++) {
            var groupIndex = Math.floor(index / groupSize);
            if (!result[groupIndex]) {
                result[groupIndex] = [];
            }
            result[groupIndex].push(input[index]);
        }
        return result;
    };
});

<div ng-controller="Ctrl">
    <div ng-repeat="itemGroup in items | inGroupsOf:7">
        <span ng-repeat="item in itemGroup">{{item.name}}</span>
    </div>
</div>

(此处完整版:http://jsfiddle.net/bradleybuda/twhVj/3/

这导致“10 $ digest()迭代达到”错误。我已经查看了this question的已接受答案,但那里的建议对我不起作用(除了对过滤器进行核对并在控制器中完成所有操作)。有没有办法让这种ng-repeat与模板/过滤器一起工作?在控制器中执行此操作感觉很难看。

1 个答案:

答案 0 :(得分:0)

由于控制器中的第12行而发生无限循环:

result[groupIndex] = [];

$ digest循环没有发生,因为您在定义的循环中创建了一个数组,但是因为您将这些新数组嵌套在第8行中创建的数组中:

var result = [];

即使您在for循环之外创建嵌套数组,也会发生同样的错误:

var result = [];
    result[0] = [];

嵌套对象也会出现同样的情况。至于“为什么”这种情况发生,我不太确定。我已经阅读了documentation,但仍然不太明白为什么数组或对象的嵌套会导致$ digest循环发生。用字符串或数字替换嵌套数组,你就是黄金。

我想在这种情况下,逻辑必须移回控制器,而不是被称为过滤器。