angular.js ng-repeat for creating grid angular.js ng-repeat for creating grid angularjs angularjs

angular.js ng-repeat for creating grid


The accepted answer is the obvious solution however presentation logic should remain in view and not in controllers or models. Also I wasn't able to get the OP's solution to work.

Here are two ways to do create grid system when you have a flat list(array) of items.Say our item list is a alphabet:

Plunker here

$scope.alphabet = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',                    'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'];

Method 1:

This is a pure angular solution.

<div class="row" ng-repeat="letter in alphabet track by $index" ng-if="$index % 4 == 0">  <div class="col-xs-3 letter-box"        ng-repeat="i in [$index, $index + 1, $index + 2, $index + 3]"        ng-if="alphabet[i] != null">    <div>Letter {{i + 1}} is: <b> {{alphabet[i]}}</b></div>  </div></div>

The outer loop execute after every 4 iterations and creates a row. For each run of the outer loop the inner loop iterates 4 times and creates columns. Since the inner loop runs 4 times regardless of whether we have elements in array or not, the ng-if makes sure that no extraneous cols are created if the array ends before inner loop completes.

Method 2:

This is much simpler solution but requires angular-filter library.

<div class="row" ng-repeat="letters in alphabet | chunkBy:4">  <div class="col-xs-3 letter-box" ng-repeat="letter in letters" >    <div>Letter {{$index + 1}} is: <b> {{letter}}</b></div>  </div></div>

The outer loop creates groups of 4 letters, corresponding to our 'row'

[['A', 'B', 'C', 'D'], ['E', 'F', 'G', 'H'], ... ]

The inner loop iterates over the group and creates columns.

Note: Method 2 might require evaluation of filter for each iteration of outer loop, hence method 2 may not scale very well for huge data sets.


This is an old answer!

I was still a bit new on Angular when I wrote this. There is a much better answer below from Shivam that I suggest you use instead. It keeps presentation logic out of your controller, which is a very good thing.

Original answer

You can always split the list you are repeating over into a list of lists (with three items each) in your controller. So you list is:

$scope.split_items = [['item1', 'item2', 'item3'], ['item4', 'item5', 'item6']];

And then repeat it as:

<div ng-repeat="items in split_items" class="row">    <div ng-repeat="item in items" class="col-md-4">        item    </div></div>

Not sure if there is a better way. I have also tried playing around with ng-if and ng-switch but I could never get it to work.


You can simply chunk your array into subarrays of N inside of your controller. Sample code:

var array = ['A','B','C','D','E','F','G','H'];var chunk = function(arr, size) {   var newArr = [];      for (var i=0; i<arr.length; i+=size) {          newArr.push(arr.slice(i, i+size));      }   return newArr;};$scope.array = chunk(array, 2);

Now in *.html file You simply ng-repeat through the array

<div class="row" ng-repeat="chunk in array">    <div class="col-md-6" ng-repeat="item in chunk">         {{item}}    </div></div>

That workout for me :)Good luck!