Спасибо за ваши предложения, вы меня на правильном пути!
Давайте рассмотрим полное объяснение:
По умолчанию HTTP-запрос AngularJS возвращает объект
Итак, если вы хотите использовать функцию @Ariel Array.prototype.chunk, вам нужно сначала преобразовать объект в массив.
А затем использовать функцию chunk В ВАШЕМ КОНТРОЛЛЕРЕ, иначе, если она используется непосредственно в ng-repeat, это приведет вас к ошибке infdig . Итоговый контроллер выглядит:
// 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);
});
И HTML становится:
<div class="row" ng-repeat="productrow in products">
<div class="col-sm-4" ng-repeat="product in productrow">
С другой стороны, я решил напрямую вернуть массив [] вместо объекта {} из моего файла JSON. Таким образом, контроллер становится (обратите внимание на специальный синтаксис isArray: 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 останется таким же, как указано выше.
ОПТИМИЗАЦИЯ
Последний вопрос в ожидании: как сделать его 100% AngularJS без расширения массива javascript с помощью функции chunk ... если некоторые люди хотят показать нам, подходят ли ng-repeat-start и ng-repeat-end .. . Мне любопытно ;)
РЕШЕНИЕ АНДРЕЯ
Благодаря @Andrew мы теперь знаем, что добавление класса очистки начальной загрузки каждые три (или любое другое число) элементов исправляет проблему отображения из-за разной высоты блока.
Итак, HTML становится:
<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}}
И ваш контроллер остается довольно мягким с удаленной функцией 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;
});