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:
$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.