使用属性过滤骨干集合

时间:2012-02-29 22:18:38

标签: collections filter backbone.js

我有一个骨干集合,我正在尝试按属性中的id进行过滤 基本上,用户有类,并且类有一个location_id,我想按位置id进行过滤。我的收藏看起来像这样给你一个想法。

-user
   -models
     -0
       -attributes
         -location_id
      -1
       -attributes
         -location_id
      -2
       -attributes
         -location_id

我以为我可以使用

过滤这个
  var get_locations = user_class_collection.filter(function(classes){
      console.log(classes); 
       return classes.get(location_id)==location.id;
       });

  console.log(get_locations);

但是当我知道location_id在集合中时,它返回一个空数组。 知道为什么这不起作用吗?我也试图抓住classes.attributes.get,但它没有更好的

在前几个回复中,恰当地提到我必须引用get('location_id')。我现在已经这样做了,但不幸的是,我仍然得到一个空阵列。我认为filter会循环遍历类,我会得到每个类的控制台输出,但console.log(classes)只会触发一次。这是暗示吗?还是红鲱鱼?

3 个答案:

答案 0 :(得分:6)

您正在尝试从名为location_id参数值的类中获取属性 你应该改成一个字符串(实际上你可以选择如何使它成为字符串,单引号或双引号都起作用)

user_class_collection.filter(function(classes){
    return classes.get('location_id') == location.id;
});

答案 1 :(得分:1)

对于使用骨干过滤收集,最好的方法是在集合中使用过滤函数

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

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

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

然后使用下划线映射您的结果并将其转换为JSON,如

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

最后返回一个仅包含结果的新骨干集合

    return new Backbone.Collection( results ) ;

可选择如果您不想保留集合中的所有数据而只是保留过滤后的数据,则应重置集合并跳过上面的返回

    this.reset( results ) ;

查看调用已过滤的集合并渲染结果

答案 2 :(得分:0)

试试这个:

user_class_collection.select(function(classes){
    return classes.get("location_id")==location.id;
   });