2013-04-23 3 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] = []; 

в $ переваривать цикл не происходит, потому что вы создаете массив в пределах определенного цикла, а потому, что вы вложенности эти новые массивы в массиве, который вы создали в строке 8:

var result = []; 

Та же ошибка будет происходить, даже если вы создаете вложенный массив за пределами вашей цикл:

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

То же самое происходит и с вложенными объектами. Что касается «почему» это происходит, я не очень уверен. Я прочитал documentation, но все еще не понимаю, почему вложение массивов или объектов вызывает цикл $ digest. Замените вложенный массив на строку или число, и вы золотой.

Я предполагаю, что в этом случае логика должна вернуться к контроллеру и не называться фильтром.