Фильтрация коллекции Backbone возвращает массив моделей
Пример кода:
this.books = this.getBooksFromDatabase();
this.publishedBooks = this.books.filter(function(book) {
return book.get("isPublished") === "1";
});
Здесь лежит проблема:
this.books.filter возвращает массив моделей. Я попытался обернуть массив, как таковой:
var publishedBooks = _( this.books.filter(function(book) {
return book.get("isPublished") === "1";
}))
как рекомендовано в этом сообщении:
https://github.com/documentcloud/backbone/issues/120
Но я все еще не могу запускать такие вещи, как:
publishedBooks.each(...), или
publishedBooks.get(...)
Что мне не хватает? Есть ли способ преобразования возвращенного массива в коллекцию?
Ответы
Ответ 1
Вы можете либо создать новую базовую коллекцию, либо передать ее в массив.
var myPublishedBooks = new MyBooksCollection(publishedBooks);
Или вы можете обновить исходную коллекцию.
this.books.refresh(publishedBooks)
Примечание, что 0.5.0 релиз в июле 2011 года переименован refresh
в reset
, так что вы можете достичь этого в новее версии Backbone с;
this.books.reset(publishedBooks)
Ответ 2
var collection = new Backbone.collection(yourArray)
Ответ 3
Я часто делаю что-то вроде этого:
var collection = new MySpecialCollection([...]);
//And later...
var subset = new collection.constructor(collection.filter(...));
Это создаст экземпляр того же типа, что и исходная коллекция, с отфильтрованными моделями, чтобы вы могли продолжить методы сбора (каждый, фильтр, найти, выщипывать и т.д.).