【问题标题】:Knockout very slow on updating single data (large dataset)更新单个数据(大型数据集)的淘汰赛非常慢
【发布时间】:2014-01-05 06:33:01
【问题描述】:

我有一个淘汰赛项目进展顺利,直到我开始使用它来处理更多数据。使用少于 50 条记录的数据集,这很棒。但是如果有 200 条、500 条甚至更多条记录,它就无法做到。

我已经阅读了所有我可以阅读的内容(包括Knockout.js incredibly slow under semi-large datasets),但我的问题无法通过模板解决。我正在使用 SlickGrid(并且无法切换到 ko.grid)并且当时尝试禁用部分屏幕,我真的认为这与网格有关。

在更新字段时会出现此问题。它会冻结屏幕一分钟或更长时间。它会在此过程中更新一些 Computed,但它们都不会花费任何显着的时间来运行。

我尝试限制 Computeds 以将它们从等式中删除,但没有帮助。

除了对数据进行分页以从不处理超过 50 条记录之外,有什么想法吗?

编辑:我能展示的最接近的是我所基于的这个小提琴:http://jsfiddle.net/rniemeyer/A9NrP/

我主要编辑了更新部分:

var data = ko.utils.unwrapObservable(settings.data); //just for subscription

很重,我使用了另一种机制来订阅更新。

它在 Fiddle 上运行良好,但在大规模上却不行。我目前的假设是,在一个记录发生变化后,所有可观察的数据都会被重新评估,即使是那些没有变化的。

【问题讨论】:

  • 如果您可以为应用程序的有问题部分添加一个小提琴/或对问题进行等效模拟,这将有助于调试/推荐解决方案。
  • 我很愿意,但这是不可能的;该项目超级大,简化它以将其放入 Fiddle 绕过了问题......对不起
  • 这个问题可能与对更新的 observable 没有足够精细的控制有关。但没有孤立的测试用例,一切都只是猜测。

标签: knockout.js slickgrid


【解决方案1】:

在淘汰赛 3 中,绑定是在单个元素上评估的,因此对一个元素的更新不会评估您可能拥有的其他绑定。

这可能与您的问题有关,因此如果您使用任何旧版本,请尝试更新,看看它是否能改善您的情况。

  1. 如果您在淘汰赛中有许多绑定

  2. Here also Ryan Niemeyer talks about very large abservable arrays and how to optimise pushing items into them

【讨论】:

  • 我已经在使用 ko v3.0.0。我知道如果没有完整的代码,这很难推销。但无论如何,感谢所有提出想法的人!
【解决方案2】:

我终于明白了。问题出在 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。通过对网格数据的细粒度更新,它的运行速度足够快,并且会在正确的时间重新计算。

再次感谢所有参与的人。

【讨论】:

    猜你喜欢
    • 2013-06-26
    • 1970-01-01
    • 2012-04-08
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多