web-dev-qa-db-ja.com

バックボーンコレクションをフィルタリングすると、モデルの配列が返されます

サンプルコード:

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/12

しかし、私はまだ次のようなものを実行することはできません:publishedBooks.each(...)、またはpublishedBooks.get(...)

何が足りないのですか?返された配列をコレクションに変換する方法はありますか?

25
Dru

新しいバックボーンコレクションをインスタンス化して、配列に渡すことができます。

var myPublishedBooks = new MyBooksCollection(publishedBooks);

または、元のコレクションを更新することもできます。

this.books.refresh(publishedBooks)

2011年7月の0.5.0リリースrefreshの名前をresetに変更しました。したがって、新しいバージョンのBackboneでこれを実現できます。

this.books.reset(publishedBooks)
34
c3rin
var collection = new Backbone.collection(yourArray)
4
Andrea Puddu

私はよくこのようなことをします:

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

これにより、フィルタリングされたモデルを使用して、元のコレクションと同じタイプのインスタンスが作成されるため、コレクションメソッド(each、filter、find、pluckなど)を続行できます。

3
stephenr85