【问题标题】:knockout mapping performance issue [duplicate]淘汰赛映射性能问题[重复]
【发布时间】:2012-10-03 11:10:48
【问题描述】:

可能重复:
Knockout.js incredibly slow under semi-large datasets

我的模型中有以下事件,如果我只有少量记录,它可以正常工作,但如果我有几十条记录,IE 会抱怨我的脚本运行速度太慢。

    self.getTrades = function () {

    $.ajax({

        type: "GET",
        cache: false,
        url: "/_vti_bin/DBOrderService/DBOrderService.svc/GetTradesByDateSource?format=json&traddate=" + self.selectedDate() + "&source=" + self.selectedSource(),
        success: function (data, textStatus, jqXHR) {
            if (data.requeststatus.code === 1) {
                var statusId = SP.UI.Status.addStatus(data.requeststatus.message);
                SP.UI.Status.setStatusPriColor(statusId, 'red');
                return;
            }
           debugger;
           ko.mapping.fromJS({ trades: data.trades }, mappings, self); //too slow, events are firing as items are added
            self.selectedTrade(null);
        },
        error: ajaxError
    });
};

我认为这是因为映射正在为添加的每一行触发更改通知,所以我想将新行“批量”复制到我的模型中。

我试过了

 var temptrades = ko.mapping.fromJS(data.trades, mappings);
 self.trades=temptrades();

self.trades(temtrades);

self.trades(temptrades();

但他们都破坏了我的模型。 将 ko.mapping 创建的可观察数组一次复制到我的模型中的正确方法是什么。 ko.mapping 上是否有选项可以防止触发事件直到结束?

【问题讨论】:

  • 您应该查看过去的问题以获得可接受的答案。

标签: knockout.js knockout-mapping-plugin


【解决方案1】:
   ko.mapping.fromJS({ trades: data.trades }, mappings, self); //too slow, events are firing as items are added

你完全正确。在添加项目时触发事件

请看:Knockout.js Performance Gotcha #2 - Manipulating observableArrays

更好的模式是获取对我们底层数组的引用,推送到它,然后调用 .valueHasMutated()。现在,我们的订阅者只会收到一个通知,表明数组已更改。

另外,看看this answer

将 [mapping] 和 [observable array update] 分成两个步骤可能会有所帮助。

【讨论】:

    猜你喜欢
    • 2015-03-30
    • 2012-08-31
    • 1970-01-01
    • 2012-09-05
    • 2013-05-27
    • 2012-06-08
    • 1970-01-01
    • 2012-12-05
    • 2017-07-07
    相关资源
    最近更新 更多