Ei,
qual é a melhor maneira de reverter a ordem de classificação de uma coleção? meu comparador classifica todos os modelos por data,
mas eu precisaria deles na ordem inversa. usar toArray()
e reverse()
parece muito feio.
dado que não estou perdendo algo importante aqui, eu votaria em um atributo de modelo de backbone para definir o
ordem de classificação junto com o comparador.
Felicidades,
Daniel
A melhor maneira de reverter a classificação da coleção é retornar um valor negativo de seu critério de comparação.
comparator : function(model) {
return -model.get('date');
}
Como isso deve funcionar ao classificar em ordem alfabética um valor de string?
Se tudo o que você tem são valores de string, talvez converta para uma data anterior?
Eu tive o mesmo problema e isso resolveu.
comparator : function(model) {
return -new Date(model.get('date'));
}
Isso só funciona para datas (que são convertidas em números quando você os prefixa com -), mas não para strings arbitrárias que você deseja classificar em ordem alfabética.
Claro que você está certo, presumi que você ainda estava falando sobre datas (como o OP), mas que sua data era uma string conversível. Meu erro então :).
A próxima versão do Backbone (e o mestre atual) suportará ordens de sort
para comparadores (em vez de apenas sortBy
), então você poderá defini-lo da maneira usual.
comparator: function(a, b) {
...
}
O que você faz se tiver vários casos de uso para a mesma coleção, alguns dos quais devem ser mostrados em uma ordem e os outros no reverso? Suas implementações de comparador e classificação podem escolher apenas uma direção ou outra, não parece haver um Collection.reverse () para ser capaz de alternar rapidamente as direções de classificação (crescente ou decrescente).
@ elwayman02 Você pode manter apenas 2 instâncias de coleção (Collection # clone pode ajudar)
Isso não é particularmente útil ... tome por exemplo uma situação em que a coleção representa uma grade de dados que classificarei repetidamente em várias direções. Não faz sentido tentar manter duas fontes de dados diferentes e alternar entre elas. Deve haver um objeto de dados que manipulamos conforme necessário.
Eu armazenei vários comparadores em uma coleção e os troquei conforme necessário.
var Collection = Backbone.Collection.extend({
comparators: {
a: function () {},
b: function () {}
},
setComparator: function (key) {
this.comparator = this.comparators[key];
return this;
}
});
var collection = new Collection();
collection.setComparator('a').sort();
collection.setComparator('b').sort();
Essa é uma solução alternativa melhor, embora eu ainda não entenda por que uma solução alternativa é necessária em vez do backbone simplesmente suportando um método reverse ().
Você também poderia fazer
collection.set(collection.models.reverse(), {sort: false});
Comentários muito úteis
Você também poderia fazer