O que estou tentando fazer é classificar alguns dados por propriedade. Aqui está um exemplo que eu pensei que deveria funcionar, mas não funciona.
Parte HTML:
<div ng-app='myApp'>
<div ng-controller="controller">
<ul>
<li ng-repeat="(key, value) in testData | orderBy:'value.order'">
{{value.order}}. {{key}} -> {{value.name}}
</li>
</ul>
</div>
</div>
Parte JS:
var myApp = angular.module('myApp', []);
myApp.controller('controller', ['$scope', function ($scope) {
$scope.testData = {
C: {name:"CData", order: 1},
B: {name:"BData", order: 2},
A: {name:"AData", order: 3},
}
}]);
E o resultado:
- A -> AData
- B -> BData
- C -> CData
... aquele IMHO deve ser assim:
- C -> CData
- B -> BData
- A -> AData
fonte
{1:'Example 1', 2:'Example 2', 3:'Example 3', ...}
for(var objectKey in input) { input[objectKey]['_key'] = objectKey; array.push(input[objectKey]); }
Como que podemos usar<div ng-repeat="value in object | orderObjectBy:'order'" ng-init="key = value['_key']">
... | orderBy: 'name'
.É muito fácil, basta fazer assim
fonte
Não se esqueça de que parseInt () só funciona para valores inteiros. Para classificar os valores da string, você precisa trocar isso:
com isso:
fonte
Como você pode ver no código do angular-JS ( https://github.com/angular/angular.js/blob/master/src/ng/filter/orderBy.js ) ng-repeat não funciona com objetos. Aqui está um hack com sortFunction.
http://jsfiddle.net/sunnycpp/qaK56/33/
fonte
de acordo com http://docs.angularjs.org/api/ng.filter:orderBy , orderBy classifica uma matriz. No seu caso, você está passando um objeto, portanto, terá que implementar sua própria função de classificação.
ou passe um array -
dê uma olhada em http://jsfiddle.net/qaK56/
fonte
Você realmente deve melhorar sua estrutura JSON para corrigir seu problema:
Então você poderia fazer
O problema, eu acho, é que as variáveis (chave, valor) não estão disponíveis para o filtro orderBy e você não deve armazenar dados em suas chaves de qualquer maneira
fonte
Aqui está o que eu fiz e funciona.
Acabei de usar um objeto stringificado.
<div ng-repeat="message in thread | orderBy : '-mostRecent.timeStamp'" >
se eu quisesse classificar por texto, faria
fonte
Vou adicionar minha versão atualizada do filtro, que é capaz de suportar a próxima sintaxe:
Agradecimentos a Armin e Jason por suas respostas neste tópico, e a Alnitak neste tópico .
fonte
A resposta de Armin + uma verificação rigorosa de tipos de objetos e chaves não angulares, como
$resolve
fonte
O seguinte permite a ordenação de objetos por chave OU por uma chave dentro de um objeto .
No modelo, você pode fazer algo como:
Ou ainda:
O filtro:
fonte