我正在学习Knockout,并试图弄清楚为什么分页不适用于我创建的计算可观察数组。
这段代码最初只使用了可观察数组,但是我发现链接计算使得代码更容易使用它进行分页和搜索。
http://jsfiddle.net/yustas2/sjLeospx/16/
self.PageSize = 3;
self.CurrentPage = ko.observable(0);
self.PageData = ko.computed(function() {
//alert('current page*size' + self.CurrentPage() * self.PageSize + ' ' + self.PageSize);
//alert(ko.toJSON(self.Products.slice(self.CurrentPage()*self.PageSize, self.PageSize)));
return self.Products.slice(self.CurrentPage() * self.PageSize, self.PageSize);
}, self);
self.PageCount = ko.computed(function() {
return Math.ceil(self.Products().length / self.PageSize);
}, self);
self.Pages = ko.computed(function() {
return new Array(self.PageCount());
}, self);
self.GoToPage = function(data) {
self.CurrentPage(data());
};
我不知道我应该在这里粘贴多少代码,但所有代码都在jsfiddle上。
基本上,我看到的是正在加载数据并且第一页显示正常。当我尝试切换页面时,原始数组的切片不起作用,直到我回到第一页。
我怀疑将currentpage作为observable并不会推动计算链,尽管它确实发生了变化。
谢谢。
答案 0 :(得分:0)
用以下功能替换您的功能:
self.PageData = ko.computed(function() {
var sliceFrom =self.CurrentPage()*self.PageSize; // this is the first for each page
var sliceTo = (self.CurrentPage()*self.PageSize)+self.PageSize; // first of page + pageSize
return self.Products.slice(sliceFrom ,sliceTo);
}, self);
因此,这可以修复切片,方法是从应该驻留在该列表中的第一个项目切片+每次所需的实际页面大小。
编辑: 同样在你的小提琴中删除这一行
self.CurrentPage(0);
在self.Load()中推送新产品后,在ko.utils.arrayForEach调用推送数组中的产品后运行此行,只需在加载数据后设置当前页面