1

我有一个集合,比如说 20 个项目......我想过滤我的结果并显示其中的 5 个。比方说,索引在 5 到 9 之间。

我的 html

{{#each myCol}} <br>
   <div id="{{this.controlName}}"></div>
{{/each}}

到目前为止我的 js

var myData = {
    myCol: this.collection.models
};

for ( var i = 5; i < 10; i++) {
    var newCol = this.collection.at(i);
}

很明显,它仍然在绘制所有集合项,而不是我想要发生的索引 5 到 9...

4

3 回答 3

2

集合内部models只是一个数组,因此您可以使用slice

var five_to_nine = this.collection.models.slice(5, 10);

toArray或者,如果您不想直接访问该集合,您可以将 a加入其中models

var five_to_nine = this.collection.toArray().slice(5, 10);

slice如果您经常这样做,您还可以将方法添加到您的集合中:

var C = Backbone.Collection.extend({
    //...
    slice: function(begin, end) {
        return this.models.slice(begin, end);
    }
});

然后你可以简单地:

var five_to_nine = this.collection.slice(5, 10);

不过,您five_to_nine将是一系列模型,因此toJSON如果您的模板需要,您必须手动设置它们:

var json = _(five_to_nine).map(function(m) { return m.toJSON() });
于 2012-10-18T20:23:16.147 回答
0

也许这样?

var newCol = []
for ( var i = 5; i < 10; i++) {
    newCol.push(this.collection.at(i));
}
var myData = {
    myCol: newCol
};
于 2012-10-18T20:18:15.220 回答
0

对于使用主干过滤集合,最好的方法是获取集合并返回一个子集过滤集合,这也将使您的代码更具可重用性

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

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

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

    var results = _.filter( this.models, function ( model ) {           
        if ( model.get('index') >= min && model.get('index') <= max ) 
        return true ; 
        return false ;
    });

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

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

最后返回一个只有结果的新主干集合

    return new Backbone.Collection( results ) ;

或者,如果您不想保留集合中的所有数据,而只想保留已过滤的数据,则应重置集合并跳过上面的返回,例如

    this.reset( results ) ; 

查看:调用过滤后的方法并在每个项目上使用 render()

于 2013-10-18T14:22:11.913 回答