我有一个淘汰赛项目,直到我开始使用更多数据。对于不到50条记录的数据集,它很棒。但是,如果有200个,500个以上的记录,它就不会这样做。
我已经阅读了我可以做的所有事情(包括Knockout.js incredibly slow under semi-large datasets)但我的问题无法通过模板解决。我正在使用SlickGrid(并且无法切换到ko.grid)并且当时尝试禁用部分屏幕,我真的认为它与网格有关。
更新字段时会出现此问题。它将屏幕冻结一分钟或更长时间。它在整个过程中更新了一些计算机,但它们都没有花费任何有意义的时间来运行。
我试图限制Computeds将它们从等式中删除,但它没有帮助。
除了将数据分页从不使用超过50条记录之外,还有什么想法?
编辑:我能展示的最接近的是我所在的小提琴:http://jsfiddle.net/rniemeyer/A9NrP/
我主要编辑了更新部分:
var data = ko.utils.unwrapObservable(settings.data); //just for subscription
很重,我使用另一种机制来订阅更新。
它在小提琴上工作得很好但是在大规模上却没有。我目前的假设是,所有可观测量都会在一个记录发生变化后重新评估,即使是那些没有变化的记录。
答案 0 :(得分:0)
在敲除3中,在单个元素上评估绑定,因此对其中一个元素的更新不会评估您可能具有的其他绑定。
这可能与您的问题有关,因此如果您使用的是任何旧版本,请尝试更新,看看它是否能改善您的情况。
答案 1 :(得分:0)
我终于明白了。问题出在DataView周围。我正在更新所有更改(有时甚至更频繁)。我在ViewModel中构建了一个计算的observable来重新计算它:
var cachedFilterCount = 0;
var dataViewUpdater = ko.computed(function () {
var cachedCount = cachedFilterCount, actualCount = viewModel.filteredEmployeeList().length;
if (cachedCount !== actualCount) {
cachedFilterCount = actualCount;
dataView.setItems(ko.toJS(viewModel.filteredEmployeeList), "EmployeeId");
} else if (viewModel.vmHasChanges()) {
_.any(filteredEmployeeList(), function (item) {
if (item.hasChanges()) {
dataView.updateItem(item.EmployeeId(), ko.toJS(item));
}
});
}
});
而不是先前对我的基本列表中的任何更改执行完整的dataView.setItems。通过对网格数据进行细粒度更新,它可以快速工作,并在适当的时间重新计算。
再次感谢所有投入的人。