目标:我正在尝试创建一个不区分大小写的搜索,该搜索遍历我的集合并尝试将用户查询与模型的name属性进行匹配。现在,如果我想找到一个特定的模型,搜索查询必须是准确的。
似乎没有简单的方法可以在Backbone中做这么简单的事情,而不是开箱即用。我想到了函数map
。如果我可以浏览整个集合并将模型的name属性更改为小写,然后将用户查询更改为小写,那么该怎么办呢?
但问题是我不知道如何使用Backbone Collection和map
函数。 Backbone文档中没有关于map
的文档,除了一个链接,它引导您使用三个数字的数组使用超级原始示例代码来强调文档。
这不起作用......为什么?
this.collection.map(function(model) {
return model.get('name').toLowerCase();
});
答案 0 :(得分:8)
实际上,所有下划线的集合方法都在Backbone.Collection对象上代理。当你执行collection.map(...
时,它返回映射函数返回的对象数组。 raina77ow提供的解决方案不起作用,因为Backbone.Collection不是数组,并且将地图结果分配给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
事件,例如重新渲染您的视图。