私は、ビューレイヤーでこれを行うことを強くお勧めします。あなたはあなたのビューに大量のコードを追加するつもりです。そして、あなたはこのコードの多くを複数のビューの間で複製することになります(1つはデータを表示するため、1つはページリストとカウント、1つは...)。 )。
デコレータパターンを使用して、これを処理する方法を知っているコレクションを作成します。私はこれをデータのフィルタリング、並べ替え、ページングのために行います。それはとてもうまく動作します。
例えば、ここに(ここではJSFdiddleで実行されている:http://jsfiddle.net/derickbailey/vm7wK/)私はフィルタリングを設定する方法ですあなたの場合
function FilteredCollection(original){
var filtered = Object.create(original);
filtered.filter = function(criteria){
var items;
if (criteria){
items = original.where(criteria);
} else {
items = original.models;
}
filtered.reset(items);
};
return filtered;
}
var stuff = new Backbone.Collection();
var filtered = FilteredCollection(stuff);
var view = Backbone.View.extend({
initialize: function(){
this.collection.on("reset", this.render, this);
},
render: function(){
var result = this.collection.map(function(item){ return item.get("foo"); });
this.$el.html(result.join(","));
}
});
を、あなたはこのようにフィルタリングを行うことはありません...しかし、ページングのためのアイデアストリーミングは同じになります。
"PagingCollection"でどのページが表示されているのかを追跡し、元のコレクションがリセットされたり新しいデータが追加されたりすると、PagingCollection関数は最終データに必要なデータを再計算しますpagedCollectionインスタンスを作成し、必要なデータでそのコレクションをリセットします。
(これはテストされていないと不完全ですが。あなたには、いくつかの詳細に記入して、アプリケーションのニーズのためにそれを肉付けする必要があります)このような何か
function PagingCollection(original){
var paged = Object.create(original);
paged.currentPage = 0;
paged.totalPages = 0;
paged.pageSize = 0;
paged.setPageSize = function(size){
paged.pageSize = size;
};
original.on("reset", function(){
paged.currentPage = 0;
paged.totalPages = original.length/paged.pageSize;
// get the models you need from "original" and then
// call paged.reset(models) with that list
});
original.on("add", function(){
paged.currentPage = 0;
paged.totalPages = original.length/paged.pageSize;
// get the models you need from "original" and then
// call paged.reset(models) with that list
});
return paged;
}
あなたは、ページング情報で飾られたコレクションを持っていたら、ページされたコレクションをCollectionViewまたはCompositeViewインスタンスに渡します。これらは、コレクションに渡されたモデルに適切にレンダリングされます。
CollectionViewとCompositeViewについて... CompositeViewは、コレクションの周りにモデル/テンプレートをレンダリングすることを可能にするCollectionView(直接から拡張されています)です。それは大部分の違いです...彼らはコレクションを扱い、そのコレクションからのビューのリストをレンダリングします。
を参照してください。しかし、それを "ハック"する必要がある場合、より基本的な部分から新しいものを作成するだけでよいでしょう。あなたがページ上に必要な要素だけを含むようにCompositeViewの実際の「コレクション」を変更することができるかもしれないことを覚えておいてください。また、ページごとに1つずつ、サーバーのCompositeViewを作成することもできます。 –