Gracias por tus sugerencias, ¡me pusiste en el camino correcto!
Vayamos por una explicación completa:
Por defecto AngularJS http get query devuelve un objeto
Entonces, si desea utilizar la función @Ariel Array.prototype.chunk, primero debe transformar el objeto en una matriz.
Y luego usar la función chunk EN SU CONTROLADOR; de lo contrario, si se usa directamente en ng-repeat, obtendrá un error de infdig . El controlador final se ve:
// 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);
});
Y HTML se convierte en:
<div class="row" ng-repeat="productrow in products">
<div class="col-sm-4" ng-repeat="product in productrow">
Por otro lado, decidí devolver directamente una matriz [] en lugar de un objeto {} de mi archivo JSON. De esta manera, el controlador se convierte (tenga en cuenta la sintaxis específica 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 sigue siendo el mismo que el anterior.
MEJORAMIENTO
La última pregunta en suspenso es: cómo hacerlo 100% AngularJS sin extender la matriz de javascript con la función chunk ... si algunas personas están interesadas en mostrarnos si ng-repeat-start y ng-repeat-end son el camino a seguir ... . Soy curioso ;)
LA SOLUCIÓN DE ANDREW
Gracias a @Andrew, ahora sabemos que agregar una clase de arranque clearfix cada tres (o cualquier número) elemento corrige el problema de visualización desde diferentes alturas de bloque.
Entonces HTML se convierte en:
<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}}
Y su controlador se mantiene bastante suave con la función de chunck eliminada :
// 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;
});