2012-03-23 3 views
4

У меня есть коллекция Backbone.js, которая содержит (например) 30 элементов.Фильтрация коллекции Backbone.js по индексу

Я хочу передать свою коллекцию фильтров, состоящую из каждого элемента в оригинальной коллекции.

Кто-нибудь знает, как это можно сделать элегантно? Код CoffeeScript является предпочтительным.

ответ

6

Предполагая, что здесь что originalCollection ваша существующая коллекция

var newCollection = new Backbone.Collection(); 

for (var i = 0, l = originalCollection.length; i < l; i++) { 
    if (i % 3 === 0) { newCollection.add(originalCollection.models[i]); } 
} 

Этот код работает циклически каждой существующей модели, и только при добавлении модели в такой новой коллекции, если это индекс кратно 3.

Вы можете сделать это немного лучше, с помощью подчеркивания each метод, предоставляемых Underscore.js в Backbone Коллекции:

var newCollection = new Backbone.Collection(); 

originalCollection.each(function (model, index) { 
    if (index % 3 === 0) { newCollection.add(model); } 
}); 

Преобразования выше результаты в CoffeeScript:

newCollection = new Backbone.Collection() 
originalCollection.each (model, index) -> 
    newCollection.add model if index % 3 is 0 
+0

благодарит за подробный ответ! – liorix

2

коллекции Backbone имеют некоторые полезные Underscore methods смешанных-ин. Вы можете использовать filter, чтобы получить массив моделей, которые можно передать в шаблон:

filteredModels = collection.filter (model, i) -> i % 3 == 0 

В качестве альтернативы, вы можете использовать понимание массива; хотя я думаю, что это менее читаемыми ...

filteredModels = (model for model, i in collection.models when i % 3 == 0) 

Если вы действительно нужно Backbone.Collection в шаблоне, вы можете создать новую с теми отфильтрованных моделями:

filteredCollection = new Backbone.Collection filteredModels 

Here является рабочим примером jsfiddle.

Смежные вопросы