Backbone集合如何与地图配合工作?

6
目标:我正在尝试创建一个不区分大小写的搜索,它可以浏览我的集合,并尝试将用户查询与模型的名称属性匹配。现在,如果我想找到特定的模型,搜索查询必须是精确的。
在Backbone中似乎没有简单的方法来完成这么简单的事情。我想到了 map 函数。如果我能浏览整个集合并将模型的名称属性更改为小写,然后也将用户查询更改为小写,那么问题不就解决了吗!
但问题是,我不知道如何使用 Backbone Collection 和 map 函数。在Backbone文档中没有关于map的任何文档说明,除了一个链接,它会引导您转到underscore文档,其中包含一个使用三个数字数组的超级原始的示例代码。
这不起作用...为什么?
this.collection.map(function(model) {
  return model.get('name').toLowerCase();
});
1个回答

8
实际上,Underscore的所有集合方法都在Backbone.Collection对象上代理。当您执行collection.map(...时,它会返回由映射函数返回的对象数组。raina77ow提出的解决方案不起作用,因为Backbone.Collection不是一个数组,将map的结果分配给this.collection会破坏集合本身。
如果您想过滤集合,我建议使用filter方法。(我假设您正在从Backbone.View中工作:)
var filter = this.$('#search-field').val(),
    filteredModels = this.collection.filter( function( model ) {
  return model.get('name').toLowerCase() === filter;
};
this.collection.reset( filteredModels );

请注意,下划线在集合上代理的任何方法都将返回模型数组。如果您想使用它们,可以使用这些模型重置集合,或者等效地将集合的模型属性设置为过滤结果:this.collection.models = filteredModels。第一种形式的优点是能够触发集合上的reset事件,您可以监听该事件,并重新呈现您的视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接