过滤主干集合返回一个模型数组

Posted

技术标签:

【中文标题】过滤主干集合返回一个模型数组【英文标题】:Filtering a Backbone Collection returns an array of Models 【发布时间】:2011-09-18 21:19:45 【问题描述】:

示例代码:

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 release in July 2011 将 refresh 重命名为 reset,因此您可以在较新版本的 Backbone 中实现这一点;

this.books.reset(publishedBooks)

【讨论】:

Collection#refresh 重命名为 Collection#reset documentcloud.github.com/backbone/#Collection-reset【参考方案2】:
var collection = new Backbone.collection(yourArray)

【讨论】:

这仅适用于“香草”骨干集合。即使使用自定义集合,也需要对其定义进行硬编码。上面带有重置的解决方案很好地避免了这种情况。【参考方案3】:

我经常这样做:

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

这将使用过滤后的模型创建与原始集合相同类型的实例,因此您可以继续使用集合方法(each、filter、find、pluck 等)。

【讨论】:

以上是关于过滤主干集合返回一个模型数组的主要内容,如果未能解决你的问题,请参考以下文章

View的主干变化模型

在主干中渲染集合模型

如何使用模型/集合获取 4 个 JSON (API) 响应到主干.js 中的一个视图

模型主干视图在第一次集合重新渲染时无法从 DOM 中删除

如果字段数组和参数数组相交,则过滤 MongoDb 集合

Django中模型