Tengo un conjunto de mosaicos que muestran un cierto número dependiendo de la opción seleccionada por el usuario. Ahora me gustaría implementar una ordenación por cualquier número que se muestre.
El siguiente código muestra cómo lo he implementado (obteniendo / estableciendo un valor en el alcance de las tarjetas principales). Ahora, debido a que la función orderBy toma una cadena, traté de establecer una variable en el alcance de la tarjeta llamada curOptionValue y ordenar por eso, pero no parece funcionar.
Entonces la pregunta es, ¿cómo puedo crear una función de clasificación personalizada?
<div ng-controller="aggViewport" >
<div class="btn-group" >
<button ng-click="setOption(opt.name)" ng-repeat="opt in optList" class="btn active">{{opt.name}}</button>
</div>
<div id="container" iso-grid width="500px" height="500px">
<div ng-repeat="card in cards" class="item {{card.class}}" ng-controller="aggCardController">
<table width="100%">
<tr>
<td align="center">
<h4>{{card.name}}</h4>
</td>
</tr>
<tr>
<td align="center"><h2>{{getOption()}}</h2></td>
</tr>
</table>
</div>
</div>
y controlador:
module.controller('aggViewport',['$scope','$location',function($scope,$location) {
$scope.cards = [
{name: card1, values: {opt1: 9, opt2: 10}},
{name: card1, values: {opt1: 9, opt2: 10}}
];
$scope.option = "opt1";
$scope.setOption = function(val){
$scope.option = val;
}
}]);
module.controller('aggCardController',['$scope',function($scope){
$scope.getOption = function(){
return $scope.card.values[$scope.option];
}
}]);
La solución aceptada solo funciona en matrices, pero no en objetos o matrices asociativas. Desafortunadamente, dado que Angular depende de la implementación de JavaScript de la enumeración de matrices, el orden de las propiedades del objeto no se puede controlar de manera consistente. Algunos navegadores pueden iterar a través de las propiedades del objeto de forma lexicográfica, pero esto no se puede garantizar.
por ejemplo, dada la siguiente asignación:
y la directiva
<ul ng-repeat="(key, card) in cards | orderBy:myValueFunction">
, ng-repeat puede iterar sobre "card1" antes de "card2", independientemente del orden de clasificación.Para solucionar esto, podemos crear un filtro personalizado para convertir el objeto en una matriz y luego aplicar una función de clasificación personalizada antes de devolver la colección.
No podemos iterar sobre emparejamientos (clave, valor) junto con filtros personalizados (ya que las claves para las matrices son índices numéricos), por lo que la plantilla debe actualizarse para hacer referencia a los nombres de claves inyectados.
Aquí hay un violín que funciona utilizando un filtro personalizado en una matriz asociativa: http://jsfiddle.net/av1mLpqx/1/
Referencia: https://github.com/angular/angular.js/issues/1286#issuecomment-22193332
fuente
El siguiente enlace explica los filtros en Angular extremadamente bien. Muestra cómo es posible definir una lógica de clasificación personalizada dentro de una repetición ng. http://toddmotto.com/everything-about-custom-filters-in-angular-js
Para clasificar objetos con propiedades, este es el código que he usado: (Tenga en cuenta que esta clasificación es el método de clasificación estándar de JavaScript y no es específico de angular) Nombre de columna es el nombre de la propiedad en la que se realizará la clasificación.
fuente
Para incluir la dirección junto con la función orderBy:
dónde
fuente
myOrderbyFunction()
en su lugar, debes escribirmyOrderbyFunction
sin()
, se invoca para cada dos pares de elementos para que puedas proporcionar una clasificación personalizada.