2013-04-23 72 views
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 $摘要()迭代达到” 错误。我已经看过this question的接受答案,但那里的建议不适用于我(除了核对过滤器并在控制器中执行此操作)。有没有什么方法可以用模板/过滤器进行这种ng-repeat工作?在控制器中做它感觉很难看。

回答

0

的无限循环,因为在控制器线路12的发生:

result[groupIndex] = []; 

的$消化循环没有发生,因为要创建一个定义环路内的阵列,但是因为你嵌套这些新的阵列

var result = []; 

即使你创建你之外的嵌套数组的for循环会出现同样的错误:你在第8行创建了一个阵列内

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

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

相关问题