Dzięki za sugestie, trafiłeś na właściwą drogę!
Przejdźmy do pełnego wyjaśnienia:
Domyślnie zapytanie http get w AngularJS zwraca obiekt
Więc jeśli chcesz użyć funkcji @Ariel Array.prototype.chunk, musisz najpierw przekształcić obiekt w tablicę.
A następnie użycie funkcji chunk W SWOIM KONTROLERZE w przeciwnym razie, jeśli zostanie użyta bezpośrednio do ng-repeat, doprowadzi cię do błędu infdig . Ostatni kontroler wygląda:
// Initialize products to empty list
$scope.products = [];
// Load products from config file
$resource("/json/shoppinglist.json").get(function (data_object)
{
// Transform object into array
var data_array =[];
for( var i in data_object ) {
if (typeof data_object[i] === 'object' && data_object[i].hasOwnProperty("name")){
data_array.push(data_object[i]);
}
}
// Chunk Array and apply scope
$scope.products = data_array.chunk(3);
});
A HTML staje się:
<div class="row" ng-repeat="productrow in products">
<div class="col-sm-4" ng-repeat="product in productrow">
Z drugiej strony zdecydowałem się bezpośrednio zwrócić tablicę [] zamiast obiektu {} z mojego pliku JSON. W ten sposób kontroler stanie się (proszę zwrócić uwagę na specyficzną składnię toArray: true ):
// Initialize products to empty list
$scope.products = [];
// Load products from config file
$resource("/json/shoppinglist.json").query({method:'GET', isArray:true}, function (data_array)
{
$scope.products = data_array.chunk(3);
});
HTML pozostaje taki sam jak powyżej.
OPTYMALIZACJA
Ostatnie pytanie w napięciu brzmi: jak zrobić to w 100% AngularJS bez rozszerzania tablicy javascript o funkcję chunk ... jeśli niektórzy są zainteresowani pokazaniem nam, czy ng-repeat-start i ng-repeat-end są do zrobienia. . Jestem ciekawy ;)
ROZWIĄZANIE ANDREWA
Dzięki @Andrew wiemy teraz, że dodawanie klasy bootstrap clearfix co trzy (lub jakikolwiek inny numer) elementów rozwiązuje problem z wyświetlaniem z różnych wysokości bloku.
Więc HTML staje się:
<div class="row">
<div ng-repeat="product in products">
<div ng-if="$index % 3 == 0" class="clearfix"></div>
<div class="col-sm-4"> My product descrition with {{product.property}}
A twój kontroler pozostaje dość miękki dzięki usuniętej funkcji chunck :
// Initialize products to empty list
$scope.products = [];
// Load products from config file
$resource("/json/shoppinglist.json").query({method:'GET', isArray:true}, function (data_array)
{
//$scope.products = data_array.chunk(3);
$scope.products = data_array;
});