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 MyCollection = Backbone.Collection.extend ({
  filtered : function ( min , max) { 

有効な場合は true を返し、無効な場合は false を返す UnderScore フィルターを使用することをお勧めします。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 ) ; 

View : フィルター処理されたメソッドを呼び出し、各項目で render() を使用します

于 2013-10-18T14:22:11.913 に答える
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 に答える