Eu tenho um conjunto de blocos que exibem um certo número dependendo da opção selecionada pelo usuário. Agora, gostaria de implementar uma classificação por qualquer número mostrado.
O código abaixo mostra como eu o implementei (obtendo / definindo um valor no escopo dos cards pai). Agora, como a função orderBy usa uma string, tentei definir uma variável no escopo do cartão chamada curOptionValue e classificar por isso, mas não parece funcionar.
Portanto, a questão é: como criar uma função de classificação 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>
e 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];
}
}]);
A solução aceita funciona apenas em arrays, mas não em objetos ou arrays associativos. Infelizmente, como Angular depende da implementação JavaScript da enumeração de array, a ordem das propriedades do objeto não pode ser controlada de forma consistente. Alguns navegadores podem iterar por meio das propriedades do objeto lexicograficamente, mas isso não pode ser garantido.
por exemplo, dada a seguinte atribuição:
e a diretiva
<ul ng-repeat="(key, card) in cards | orderBy:myValueFunction">
, ng-repeat pode iterar sobre "card1" antes de "card2", independentemente da ordem de classificação.Para contornar isso, podemos criar um filtro personalizado para converter o objeto em uma matriz e, em seguida, aplicar uma função de classificação personalizada antes de retornar a coleção.
Não podemos iterar em pares (chave, valor) em conjunto com filtros personalizados (uma vez que as chaves para matrizes são índices numéricos), portanto, o modelo deve ser atualizado para fazer referência aos nomes de chave injetados.
Aqui está um violino funcional utilizando um filtro personalizado em uma matriz associativa: http://jsfiddle.net/av1mLpqx/1/
Referência: https://github.com/angular/angular.js/issues/1286#issuecomment-22193332
fonte
O link a seguir explica filtros em Angular extremamente bem. Mostra como é possível definir a lógica de classificação personalizada em uma repetição de ng. http://toddmotto.com/everything-about-custom-filters-in-angular-js
Para classificar objetos com propriedades, este é o código que usei: (observe que essa classificação é o método de classificação JavaScript padrão e não específico para angular) Nome da coluna é o nome da propriedade na qual a classificação deve ser realizada.
fonte
Para incluir a direção junto com a função orderBy:
Onde
fonte
myOrderbyFunction()
vez disso, você escreverámyOrderbyFunction
sem()
, ele é chamado para cada dois pares de elementos para que você forneça uma classificação personalizada.