我尝试使用Paginator.clientPager
初始获取后从服务器加载其他模式
这是我的收藏,几乎是从github上的示例代码粘贴的副本。
return new (Backbone.Paginator.clientPager.extend({
model: model,
paginator_core: {
type: 'GET',
dataType: 'json',
url: '/odata/LibraryFile'
},
paginator_ui: {
// the lowest page index your API allows to be accessed
firstPage: 1,
// which page should the paginator start from
// (also, the actual page the paginator is on)
currentPage: 1,
// how many items per page should be shown
perPage: 2,
// a default number of total pages to query in case the API or
// service you are using does not support providing the total
// number of pages for us.
// 10 as a default in case your service doesn't return the total
totalPages: 5
},
server_api: {
// number of items to return per request/page
'$skip': function () { return this.perPage * (this.currentPage - 1) },
'$top': function () { return this.perPage },
},
parse: function (response) {
console.log(response);
return response.value;
}
}))();
我这样称呼初始提取
myCollection.fetch({
success: function(){
myCollection.pager();
},
silent:true
});
然后,在用户使用clientPager浏览了本地页面之后,他可能希望加载更多页面,而不删除前几个页面。
我尝试达到这种目的,但是由于某种原因,在我调用
pager();
后,将删除2条新记录。myCollection.currentPage = 2;
myCollection.fetch({
success: function(){
console.log(myCollection.length) // 4 models, with correct data
myCollection.pager();
console.log(myCollection.length) // the 2 new records are removed
},
silent:true,
remove: false // don't remove old records
});
我在做什么错,我该如何使用
Paginator.clientPager
将它再加载2页?我不想使用requestPager,因为那样我至少不能在内存中进行预缓存。
最佳答案
以我的经验,这是由Backbone.Paginator.clientPager的pager()方法引起的。您可以在这里查看代码:
Backbone.Paginator.clientPager
从292行到294行显示,如果未定义Backbone.Paginator.clientPager.origModels,则仅将其分配给当前模型(在上面的插图中正确测试了该模型的长度)。问题在于,当用户可能希望加载更多页面而不删除第一个页面时,由于初始获取,已经设置了origModels属性。
这意味着在pager()发挥作用之前,您必须再次明确地使origModels变得未定义。请注意,稍后在源代码的第296行会发生什么(将模型分配给origModels的副本)。这就是为什么您的两个新记录被删除的原因。以下代码应按预期工作:
myCollection.currentPage = 2;
myCollection.fetch({
success: function(){
delete myCollection.origModels; // to ensure that origModels is overridden in pager() call below
myCollection.pager();
},
silent:true,
remove: false // don't remove old records
});