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.select
para 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 greaterThan
mé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.