私が使用している現在の方法は、配列を返すコレクションをフィルタリングし、それを再移入しBackbone.js:コレクションをフィルタリングする正しい方法は?
collection.reset(array)
使用することです。しかし、これは元のコレクションを変更するので、コレクションの初期配列状態を追跡する「originalCollectionArray」という配列を追加しました。何のフィルタリングがアクティブでないときに私は単に
collection.reset(originalCollectionArray)
を使用しかし、その後、私は本当のコレクションからモデルの追加や削除を追跡する必要があるので、私はこれをしなかった:
// inside collection
initialize: function(params){
this.originalCollectionArray = params;
this.on('add', this.addInOriginal, this);
this.on('remove', this.removeInOriginal, this);
},
addInOriginal: function(model){
this.originalCollectionArray.push(model.attributes);
},
removeInOriginal: function(model){
this.originalTasks = _(this.originalTasks).reject(function(val){
return val.id == model.get('id');
});
},
filterBy: function(params){
this.reset(this.originalCollectionArray, {silent: true});
var filteredColl = this.filter(function(item){
// filter code...
});
this.reset(filteredColl);
}
は、これはすぐに面倒になってきています並べ替えなど、コレクションの操作に関連するその他のトリックを実装しようとしています。そして率直に言って、私のコードはちょっとハッキリです。これを行うエレガントな方法はありますか?
おかげ
はあなただけ( '{:真追加})フェッチ使用していない何らかの理由があります'リセットする代わりに?これはあなたが達成しようとしているようなものです。私はあなたの 'filter'関数が何をしているのかよく分かりませんが、' {data:{...}} 'も渡すことができます。 – bvulaj
正しく理解すれば、originalCollectionArrayとそのイベントを完全に削除し、フィルタ/ソートを行うたびに元のデータをフェッチする必要があります(ソートはフィルタリングされたデータで実行されるので、各ソートもフェッチしてフィルタリングする必要があります)。つまり、ユーザー入力時にフィルターがトリガーされます。あまりにも多くのリソースを無駄にすると思った。私は仮説的にしか話していない。 – chenglou