我抓住了一个jsfiddle,它做了一个分页示例。我在页面顶部有这个:
var persons = []; //holds array of names/tables
var viewModel = {
fields: ko.observableArray(persons),
pageSize: ko.observable(1),
pageIndex: ko.observable(0),
};
viewModel.pagedRows = ko.dependentObservable(function() {
var size = this.pageSize();
var start = this.pageIndex() * size;
return this.fields.slice(start, start + size);
}, viewModel);
viewModel.maxPageIndex = ko.dependentObservable(function() {
return Math.ceil(this.fields().length / this.pageSize()) - 1;
}, viewModel);
然后我有一个jquery ajax调用来读取纯文本文件,并将viewModel.pageSize的属性设置为一个值(在我的例子中为10),并且工作正常。返回对象数组的数据调用更新viewModel.fields,屏幕上显示前10行。
我有一个“window.setinterval”,它每10秒调用一次“分页”函数,用于分页数据:
function paging() {
viewModel.pageIndex(viewModel.pageIndex() + 1);
if (viewModel.pageIndex() > viewModel.maxPageIndex) {
viewModel.pageIndex(0);}
}
它几乎可以工作...... pageIndex保持递增,页面上的数据刷新,并在与knockout绑定的字段的“pagedRows”子集中显示正确的起点。但是,只要调用第一个定时“分页”函数,“pagedRows”就会突然从包含10个对象跳到“fields”observablearray中的所有剩余对象。我不明白为什么?第一次通过它正确地将它设置为10,然后当它执行切片以获得下一个10时,它会这样做,但似乎在它获取的10之后附加所有剩余的对象。这就像viewmodel中pagedRows函数中的“要获取的项目数”出错了。
我毫不怀疑这对我来说是一个简单的误会,但我现在很难过。一直在看这个,我的初学者技能无法解决。
与“maxPageIndex”进行比较以触发返回零也无法正常工作,它只是永远递增!
答案 0 :(得分:0)
viewModel.maxPageIndex是dependentObservable。这意味着这是一个很大的奇特对象。所以你不能只是参考
viewModel.maxPageIndex
并期望得到计算值。相反,请致电
viewModel.maxPageIndex.peek()
获取计算值。
请注意,它们不再被称为dependentObservables,但已被更改为计算的可观察量。
有关详细信息,请参阅http://knockoutjs.com/documentation/computedObservables.html上的文档。
答案 1 :(得分:0)
所以,有几个问题。
首先,我使用旧式的“dependentObservable”而不是“计算”,但这不是问题,因为它仍然可以这样运作!
其次,我在分页方法中错过了“pageMaxIndex”末尾的括号:
if (viewModel.pageIndex() > viewModel.maxPageIndex()) {
现在有效,不需要“偷看”来返回值。
切片问题是因为我的json调用返回了页面大小的字符串值。添加到偏移量时,这会导致结果为串联字符串而不是数字结果。我最后以“1020”而不是“30”结束了!
感谢CodeThug指出