【问题标题】:Backbone filtering骨干过滤
【发布时间】:2012-05-24 16:41:53
【问题描述】:

如果我有一个 Backbone 集合并且想要创建该集合的副本并过滤掉某些条目,我该如何在将复制的实例保留为 Backbone.Collection 的同时做到这一点?

例子:

var Module = Backbone.Model.extend();

var ModuleCollection = Backbone.Collection.​extend({
    model: Module
});

​var modules = new ModuleCollection;

​modules.add({foo: 'foo'​​​​​​},{foo: 'bar'});​​​​​

console.log(modules instanceof Backbone.Collection); // true

var filtered = modules.filter(function(module) {
    return module.get('foo') == 'bar';
});

console.log(filtered instanceof Backbone.Collection); // false

http://jsfiddle.net/m9eTY/

在上面的示例中,我希望 filtered 成为模块的过滤版本,而不仅仅是模型数组。

基本上我想在集合实例中创建一个可以过滤掉某些模型并返回 Backbone.Collection 实例的方法,但是一旦我开始过滤迭代方法就会返回一个数组。

【问题讨论】:

    标签: javascript collections backbone.js models underscore.js


    【解决方案1】:

    如果需要,您可以将过滤后的数组包装在临时 ModuleCollection 中,过滤后的模型与原始 ModuleCollection 中的模型相同,因此如果模块的属性发生更改,两个集合仍会引用它。

    所以我建议你做的是:

    var filtered = new ModuleCollection(modules.filter(function (module) {
        return module.get('foo') == 'bar';
    }));
    

    从 Backbone 0.9.2 开始,还有一个名为 where 的附加方法可以做到这一点:

    var filtered = modules.where({foo: 'bar'});
    

    虽然它仍然返回一个数组,所以你仍然需要这样包装它:

    var filtered = new ModuleCollection(modules.where({foo: 'bar'}));
    

    【讨论】:

      【解决方案2】:

      用于使用主干过滤集合

      要制作过滤器,您的集合中应该有一个过滤函数

      var MyCollection = Backbone.Collection.extend ({
        filtered : function () { 
      

      我建议使用 UnderScore 过滤器,它将返回 true 表示有效,false 表示无效,其中 true 是您要查找的内容。使用 this.models 获取当前集合模型 使用 model.get( '' ) 获取要检查的元素

      var results = _.filter( this.models, function ( model ) {           
          if ( model.get('foo') == 'bar' ) 
          return true ; 
          return false ;
      });
      

      然后使用下划线映射您的结果并将其转换为 JSON,这可能是您弄错的地方

      results = _.map( results, function( model ) { return model.toJSON()  } );
      

      最后返回一个只有结果的新主干集合,这是制作复制集合的方法

      return new Backbone.Collection( results ) ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多