0

我抓住了一个 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 不断增加,页面上的数据刷新并在与敲除绑定的“pagedRows”字段子集中显示正确的起点。然而,一旦第一个定时“分页”函数被调用,“pagedRows”突然从包含 10 个对象跃迁到“字段”可观察数组中的所有剩余对象。我不明白为什么?第一次通过它正确地将其设置为 10,然后当它执行切片以获取下一个 10 时,它会这样做,但似乎在它获取的 10 之后附加所有剩余的对象。这就像 viewmodel 的 pagedRows 函数中的“要获取的项目数”出错了。

我毫不怀疑这对我来说将是一个简单的误解,但我现在很难过。一整天都在看这个,我的初学者技能无法解决。

此外,与“maxPageIndex”的比较以触发返回零也无法正常工作,它只会永远增加!

4

2 回答 2

0

viewModel.maxPageIndex 是一个dependentObservable。这意味着它是这个花哨的大物体。所以你不能只参考

viewModel.maxPageIndex

并期望得到计算值。而是调用

viewModel.maxPageIndex.peek()

取回计算值。

请注意,它们不再称为dependentObservables,而是已更改为计算的 observables。

有关更多信息,请参阅http://knockoutjs.com/documentation/computedObservables.html上的文档。

于 2013-04-08T04:27:43.707 回答
0

所以,有几个问题。

首先,我使用的是老式的“dependentObservable”而不是“computed”,但这不是问题,因为它仍然可以这样工作!

其次,我在分页方法中错过了“pageMaxIndex”末尾的括号:

if (viewModel.pageIndex() > viewModel.maxPageIndex()) {

现在可以工作并且不需要“偷看”来返回值。

切片问题是因为我的 json 调用返回了页面大小的字符串值。当添加到偏移量时,这会导致结果是连接字符串而不是数字结果。我最终得到的是“1020”而不是“30”!

感谢 CodeThug 的指点

于 2013-04-08T07:58:36.463 回答