更新淘汰变量/属性计算是不是有效?

时间:2013-04-07 21:14:33

标签: jquery knockout.js

我抓住了一个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”进行比较以触发返回零也无法正常工作,它只是永远递增!

2 个答案:

答案 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指出