Backbone: ordem reversa de classificação de modelos em uma coleção

Criado em 11 abr. 2011  ·  12Comentários  ·  Fonte: jashkenas/backbone

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

question

Comentários muito úteis

Você também poderia fazer

collection.set(collection.models.reverse(), {sort: false});

Todos 12 comentários

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});
Esta página foi útil?
0 / 5 - 0 avaliações