可能重复:
Knockout.js在半大数据集下非常慢
我在我的模型中有以下事件,如果我只有一些记录,但如果我得到几十条记录,那么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
});
};
Run Code Online (Sandbox Code Playgroud)
我认为这是因为映射会在添加每行时触发更改通知,因此我想将"批量"新行复制到我的模型中.
我试过了
var temptrades = ko.mapping.fromJS(data.trades, mappings);
self.trades=temptrades();
Run Code Online (Sandbox Code Playgroud)
和
self.trades(temtrades);
Run Code Online (Sandbox Code Playgroud)
和
self.trades(temptrades();
Run Code Online (Sandbox Code Playgroud)
但他们都只是夸大我的模型.什么是将ko.mapping创建的可观察数组一次性复制到我的模型中的正确方法.ko.mapping上是否有选项可以防止触发事件直到结束?
我有一个带有几个可观察数组的视图模型(预算,公司,成本中心).预算有一个CostcenterID和一个计算的observable,它根据costcenterid从costcenterlist返回该预算的costcenter.fostCenter有一个companyID和一个计算的observable,它根据commpanyId从公司列表中返回该costcenter的公司.
在我看来,我对预算有约束力,而且我有
<td>
<select data-bind="options:$root.Costcenter,optionsCaption:'cost center', optionsText:'Title', optionsValue:'Id', value:CostCenterId "></select>
</td>
<td>
<span data-bind="text:CostCenter().Company().Title"></span>
</td>
Run Code Online (Sandbox Code Playgroud)
如果预算有成本中心,它可以正常工作,但是当给定预算不存在成本中心时,我会收到绑定错误
0x800a139e - Microsoft JScript运行时错误:无法解析绑定.
消息:TypeError:Object不支持此属性或方法;
绑定值:文本:CostCenter().公司().标题
(如果没有根据costcenterID找到costcenter,则我对costCenter的计算observable返回一个空的Object {}.
什么是最好的方法来处理这个问题,而不是乱扔我的绑定与一堆if语句,检查一个对象是否为空?