【问题标题】:How does map work with a Backbone collection?map 如何与 Backbone 集合一起使用?
【发布时间】:2013-06-10 23:51:02
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: javascript backbone.js map underscore.js


    【解决方案1】:

    实际上,underscore 的所有集合方法都代理在 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 事件,您可以收听并重新呈现您的视图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多