property multiple fields example array angularjs angularjs-ng-repeat angularjs-filter

angularjs - multiple - ng-repeat filter condition



Orden AngularJP en ng-repeat no funciona (3)

No tiene que crear un parámetro de ámbito para su pedido. Puede hacer esto directamente en su marcado si está tratando con matrices.

<tr ng-repeat="team in teams | orderBy:count_win:false">

Con dos parámetros, solo debes hacer

<tr ng-repeat="team in teams | orderBy:[''count_win'',''goal_average'']">

Después de un orden más complejo, puede crear una función en su ámbito de la siguiente manera:

$scope.customOrder = function (team) { //custom }

Y solo llámalo como

<tr ng-repeat="team in teams | orderBy:customOrder">

Como dijo @Jerrad, ng-repeat solo funciona con matrices, por lo que debe convertir el objeto de su equipo en una matriz para que funcione correctamente.

Intento usar AngularJS para mi primer proyecto (un administrador de torneos) y el filtro orderBy en ng-repeat no funciona :( He leído toda la documentación sobre eso , pero no tengo nada que hacer: /

Entonces, tengo vars definidos en $scope así:

$scope.order_item = "count_win"; $scope.order_reverse = false; $scope.teams = { 100 : { id: 100, name: "XXX", count_win: 1, count_loose: 2, goal_average: 1, }, 200 : { id: 200, name: "XXX", count_win: 1, count_loose: 2, goal_average: 1, }, [...] };

Ahora, en mi opinión, estoy tratando de reordenar (primero con un solo artículo de pedido) pero nunca trabajo ...

<tr ng-repeat="team in teams | orderBy:order_item:order_reverse"> <td>{{team.name}}</td> <td>{{team.count_loose}}</td> <td>{{team.goal_average}}</td> </tr>

La segunda vez, quiero reordenar desde 2 piezas de información: count_win y goal_average si primero son iguales .. Intento reemplazar $scope.order_item así, pero si con uno el código no funciona, nunca funcionará con 2 ...

$scope.order_item = [''count_win'',''goal_average''];

Gracias a todos por leer y disculpas por el tamaño de la publicación.


ng-repeat solo funciona en arreglos, no en objetos JSON. Esto ya se discutió aquí: Angular: no se puede hacer una orden ng de repetición por trabajo

Debe cambiar el objeto JSON a una matriz o convertirlo sobre la marcha. El controlador podría verse así:

var app = angular.module(''app'', []); app.controller(''Ctrl'', function ($scope) { $scope.teams = [ { id: 100, name: "A Team", count_win: 1, count_loose: 2, goal_average: 1 }, { id: 200, name: "C Team", count_win: 2, count_loose: 3, goal_average: 4 }, { id: 300, name: "B Team", count_win: 4, count_loose: 1, goal_average: 8 } ]; $scope.predicate = ''name''; });

Creé un violín aquí con una demostración que contiene tus datos:

http://jsfiddle.net/c3VVL/


$scope.teams no es una matriz (es un objeto de objetos), y el filtro orderBy solo funciona con matrices. Si haces $scope.teams una matriz, funcionará:

$scope.teams = [ { id: 100, name: "team1", count_win: 3, count_loose: 2, goal_average: 2, }, { id: 200, name: "team2", count_win: 3, count_loose: 2, goal_average: 1, }, { id: 300, name: "team3", count_win: 1, count_loose: 2, goal_average: 1, } ];

O bien, puede agregar un filtro especial que funcione en objetos, como este (tomado de here ):

app.filter(''orderObjectBy'', function() { return function(items, field, reverse) { var filtered = []; angular.forEach(items, function(item) { filtered.push(item); }); filtered.sort(function (a, b) { return (a[field] > b[field] ? 1 : -1); }); if(reverse) filtered.reverse(); return filtered; }; });

Y úsalo así:

<tr ng-repeat="team in teams | orderObjectBy:order_item:order_reverse">

Tenga en cuenta que este filtro personalizado no funcionará con una matriz de órdenes de clasificación como en la segunda parte de su pregunta.