分页不适用于具有Knockout Js

时间:2017-12-12 15:50:55

标签: javascript knockout.js

我正在学习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并不会推动计算链,尽管它确实发生了变化。

谢谢。

1 个答案:

答案 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调用推送数组中的产品后运行此行,只需在加载数据后设置当前页面