淘汰映射性能问题

时间:2012-10-12 15:31:17

标签: knockout.js knockout-mapping-plugin

  

可能重复:
  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上是否有选项可以防止触发事件直到结束?

1 个答案:

答案 0 :(得分:5)

   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]拆分为两个步骤可能有所帮助。