Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Filtering a Backbone Collection returns an array of Models

Sample Code:

this.books = this.getBooksFromDatabase();
this.publishedBooks = this.books.filter(function(book) {
  return book.get("isPublished") === "1";
});

Here lies the problem:

this.books.filter, returns an array of the models. I've tried wrapping the array, as such:

var publishedBooks = _( this.books.filter(function(book) {
  return book.get("isPublished") === "1";
}))

as recommended by this post: https://github.com/documentcloud/backbone/issues/120

But i still can't run things like: publishedBooks.each(...), or publishedBooks.get(...)

What am I missing? Is there a way to convert the returned array into a collection?

like image 204
Dru Avatar asked Jun 20 '11 17:06

Dru


3 Answers

You could either instantiate a new backbone collection and pass in the array.

var myPublishedBooks = new MyBooksCollection(publishedBooks);

Or you could refresh your original collection.

this.books.refresh(publishedBooks)

Note that the 0.5.0 release in July 2011 renamed refresh to reset, so you can achieve this in newer versions of Backbone with;

this.books.reset(publishedBooks)
like image 134
c3rin Avatar answered Nov 02 '22 01:11

c3rin


var collection = new Backbone.collection(yourArray)
like image 34
Andrea Puddu Avatar answered Nov 01 '22 23:11

Andrea Puddu


I often do something like this:

var collection = new MySpecialCollection([...]);
//And later...
var subset = new collection.constructor(collection.filter(...));

This will create an instance of the same type as your original collection, with the filtered models, so you can continue with the collection methods (each, filter, find, pluck, etc).

like image 3
stephenr85 Avatar answered Nov 02 '22 01:11

stephenr85