5

バックボーンコレクションがあり、特定のエントリを除外してそのコレクションのコピーを作成したい場合、コピーしたインスタンスをBackbone.Collectionとして保持しながら、どうすればそれを行うことができますか?

例:

</ p>

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を開始するとすぐに、反復メソッドは配列を返します。

4

2 に答える 2

9

必要に応じて、フィルタリングされた配列を一時的な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'}));
于 2012-05-24T16:47:36.467 に答える
0

バックボーンを使用してコレクションをフィルタリングする場合

フィルタを作成するには、コレクションにフィルタされた関数が必要です

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

アンダースコアフィルターを使用することをお勧めします。これは、有効な場合は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 ) ;
于 2013-10-18T14:09:48.687 に答える