2

我正在尝试一次显示 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() 迭代”错误。我已经查看了这个问题的公认答案,但那里的建议对我不起作用(除了核对过滤器并在控制器中执行所有操作)。有没有办法让这种 ng-repeat 与模板/过滤器一起工作?在控制器中执行此操作感觉很难看。

4

1 回答 1

0

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

result[groupIndex] = [];

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

var result = [];

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

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

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

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

于 2013-04-25T03:08:40.123 回答