Angular.js Ng-repeat For Creating Grid
Solution 1:
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:
$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.
<divclass="row"ng-repeat="letters in alphabet | chunkBy:4"><divclass="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.
Solution 2:
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:
<divng-repeat="items in split_items"class="row"><divng-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.
Solution 3:
You can simply chunk your array into subarrays of N inside of your controller. Sample code:
vararray = ['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
<divclass="row"ng-repeat="chunk in array"><divclass="col-md-6"ng-repeat="item in chunk">
{{item}}
</div></div>
That workout for me :) Good luck!
Solution 4:
Using ng-repeat-start and ng-repeat-end
<divclass="row"><divng-repeat-start="item in items track by $index"class="col-sm-4">
{{item}}
</div><divng-repeat-endng-if="($index+1) % 3 == 0"class="clearfix"></div></div>
Easy to adapt for different media query using .visible-* classes
<divclass="row"><divng-repeat-start="item in items track by $index"class="col-lg-2 col-md-4 col-sm-6">
{{item}}
</div><divng-repeat-end><divclass="clearfix visible-lg-block"ng-if="($index+1) % 6 == 0"></div><divclass="clearfix visible-md-block"ng-if="($index+1) % 3 == 0"></div><divclass="clearfix visible-sm-block"ng-if="($index+1) % 2 == 0"></div></div></div>
I find clear and concise to have row management logic outside of the main repeat block. Separation of concerns :-)
Solution 5:
A bit late answer but i used this and i belive it is better for some cases. You can use Angular Filter package and its ChunkBy filter for this. Although this package would be a heavy lifting for this single task, there is other useful filters in it for different tasks. The code i used is like this:
<divclass="row mar-t2"ng-repeat="items in posts | chunkBy:3"><divclass="col-md-4"ng-repeat="post in items"><imgng-src="{{post.featured_url}}"class="img-responsive" /><ang-click="modalPop(post.id)"><h1class="s04-bas2">{{post.title.rendered}}</h1></a><divclass="s04-spotbox2"ng-bind-html="post.excerpt.rendered"></div></div></div>
Post a Comment for "Angular.js Ng-repeat For Creating Grid"