Filtrando coleções de backbone

As coleções de backbone incluem vários métodos para operar em seus modelos, sem impor um padrão de design específico sobre como são configurados ou usados. É simultaneamente uma revigorante lufada de ar fresco e um convite à repetição – um inimigo persistente dos verdadeiramente preguiçosos . Felizmente, extrair operações de filtragem repetidas é uma tarefa bastante simples.

Faça uma coleção que representa o estoque de uma loja:

var inventory = new InventoryCollection([
{ title: 'Water', value: 5 },
{ title: 'Fruit Juice', value: 10 },
{ title: 'Oil', value: 250 }
]);

Conforme o estoque muda, uma tarefa comum pode ser selecionar todos os itens de estoque cujo valor exceda um certo valor. Isso é bastante fácil – basta usar Collection.selectpara escolher todos os modelos sobre o valor em questão.

// in InventoryCollection
greaterThan
: function (value) {
var models = collection.select(function (model) {
return model.get(attribute) > value;
});
return models;
}

Não adianta passar uma matriz “nua” de modelos para uma visualização que espera uma coleção, portanto, os modelos precisarão ser agrupados de volta em uma instância da coleção original:

greaterThan: function (value) {
// ... select models ...
return new InventoryCollection(models);
}

Generalizando

Não é difícil imaginar o desejo de fornecer o greaterThanmétodo para outras coleções. Uma generalização pode aceitar argumentos para a coleção, atributo e valores de limite, usando o construtor da coleção para fornecer um tipo de retorno apropriado:

MyApp.greaterThan = function (collection, attribute, value) {
var models = collection.select(function (model) {
return model.get(attribute) > value;
});
return new collection.constructor(models);
};

Refazendo o exemplo original usando o novo método de serviço:

var newCollection = MyApp.greaterThan(inventory, 'value', 7);

Para uma implementação mais completa (e um monte de filtros básicos!), Verifique o repositório Backbone.Filter no github.