2

我有一个非常复杂的应用程序,其中一个 viewModel 有一个记录列表:

app.records = ko.observableArray([])

使用 AJAX,我从服务器获取一些 JSON 并将其填充到数组中:

$.getJSON("/api/records", function(data){
    app.records($.map(data, function(item){
      r = new Record(item);
      return r;
    });
});

至少,这对我的测试数据集中的 6 个项目非常有效。该应用程序几乎可以立即加载。但我也有一个创建新记录按钮,它可以做到这一点:

$.post("/api/records", {}, function(record){
    r = new Record(record);
    console.log("About to push...");
    app.records.push(r);
    console.log("Pushed the new record.");
});

第一个日志行会立即出现,但第二行大约需要 8 秒才能出现。注释掉推送使操作有效地即时。我相信问题是由我拥有的相当多的相当复杂的计算变量引起的;我认为推动导致它重新计算EVERYTHING。然而,奇怪的是在页面加载时添加六个测试项目是即时的。

谁能给我一些调试的提示?该应用程序未处于我可以轻松共享代码或构建隔离问题的 JSFiddle 的状态。我不愿意只是盲目地注释掉行以查看是否有任何解决问题的方法,因为这可能需要很长时间。有没有人有任何想法?或者至少是一个总体策略?:)

(我目前正在使用 2.1 候选版本;Knockout 2.0 也会出现问题。)

4

2 回答 2

1

看看 Niemeyer 博客上的这篇文章:http ://www.knockmeout.net/2012/04/knockoutjs-performance-gotcha.html

于 2012-06-14T12:36:06.627 回答
0

好吧,您关于计算可观察量导致性能问题的理论似乎是合理的。使用“二分搜索”策略将它们注释掉可能是定位问题的最快方法。或者,您可以将日志记录添加到您计算的所有 observables。

于 2012-04-24T15:58:49.570 回答