地图如何与Backbone集合一起使用?

时间:2013-06-10 23:51:03

标签: javascript backbone.js map underscore.js

目标:我正在尝试创建一个不区分大小写的搜索,该搜索遍历我的集合并尝试将用户查询与模型的name属性进行匹配。现在,如果我想找到一个特定的模型,搜索查询必须是准确的。

似乎没有简单的方法可以在Backbone中做这么简单的事情,而不是开箱即用。我想到了函数map。如果我可以浏览整个集合并将模型的name属性更改为小写,然后将用户查询更改为小写,那么该怎么办呢?

但问题是我不知道如何使用Backbone Collection和map函数。 Backbone文档中没有关于map的文档,除了一个链接,它引导您使用三个数字的数组使用超级原始示例代码来强调文档。

这不起作用......为什么?

this.collection.map(function(model) {
  return model.get('name').toLowerCase();
});

1 个答案:

答案 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事件,例如重新渲染您的视图。