6

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

似乎没有简单的方法可以在 Backbone 中做如此简单的事情,而不是开箱即用。map想到了这个功能。如果我可以遍历整个集合并将模型的名称属性更改为小写,然后将用户查询也更改为小写,瞧!

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

这不起作用……为什么?

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

1 回答 1

8

实际上,所有 underscore 的集合方法都代理在 Backbone.Collection 对象上。当您执行 a 时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集合上的事件,您可以收听该事件,例如重新呈现您的视图。

于 2013-06-13T22:02:04.610 回答