Knockout.js 敲除映射性能问题

Knockout.js 敲除映射性能问题,knockout.js,knockout-mapping-plugin,Knockout.js,Knockout Mapping Plugin,可能重复: 我的模型中有以下事件,如果我只有几条记录,但如果我有几十条记录,我的脚本运行太慢 self.getTrades = function () { $.ajax({ type: "GET", cache: false, url: "/_vti_bin/DBOrderService/DBOrderService.svc/GetTradesByDateSource?format=json&traddate=" +

可能重复:

我的模型中有以下事件,如果我只有几条记录,但如果我有几十条记录,我的脚本运行太慢

    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();

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

   ko.mapping.fromJS({ trades: data.trades }, mappings, self); //too slow, events are firing as items are added
你完全正确。事件在添加项目时触发

请参阅:

更好的模式是获取对底层数组的引用,推送到它,然后调用.valueHasMutated()。现在,我们的订户将只收到一个通知,指示阵列已更改

另外,看一看


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

您应该回顾过去的问题,以获得可接受的答案。
self.trades(temptrades();
   ko.mapping.fromJS({ trades: data.trades }, mappings, self); //too slow, events are firing as items are added