用敲击映射插头限制

我在使用IE8的淘汰映射插件时遇到了问题。 我们的情况是我们发送可以显示给客户的所有可能记录。 然后我们在客户端处理响应系统的所有分页和过滤。

目前,我们正在发送一个包含250条记录的列表,以便通过jQuery ajax在基于jQuery模板的网格中显示。 当我们调用ko.mapping.fromJS(而不是fromJSON函数)来映射对象时,我们从IE8得到一个“脚本耗时太长”的消息。 在FF和Chrome中不会发生,因为它们的java脚本执行得更快。

有没有直接的方法来限制映射? 这是一个长期问题,因为我们可能会有近1000条记录要发送给客户。

IE是一个顽皮的小…..不是吗。

当使用javascript进行数据绑定时,如果要进行重要的UI更新,我会执行以下操作。

function ajaxCallback(listOfDataItems){ var addToUiFunction = function(item){ // add it to the ko.observable array which is data bound to the UI myDataBoundArray.push(item); }; for (var i = 0, arrayLength = listOfDataItems.length; i < arrayLength; i++){ var temp = listOfDataItems[i]; //create an immediately executing function to close around //the item that returns a function to call at a later date. var tempFunction = (function(){ var item = temp; return function() { addToUiFunction(item) }; })(); setTimeout(tempFunction, 0); } } 

这里发生的是我一次只向UI添加一个项目。 我使用延迟为0的setTimeout来推迟单个add的执行,直到当前调用结束。 这意味着非常短的工作单元不会超时您的浏览器。

ps代码有点狡猾,它只是试图说明一点。

我们也有同样的问题。 我们的viewmodel有太多计算的observable,它导致脚本运行得更慢。 删除不必要的订阅可能会使您免于此问题。

我知道这不是一个理想的答案,但如果你的情况允许,你总是可以不映射内部项目。 防爆。 如果你的ajax调用返回1000个人并且你希望你的UI更新并显示所有这些人,你可以让你的viewmodel有一个observableArray的原始人js对象(而不是他们的ko映射等价物)。 如果您在observableArray中添加或删除项目,它将在UI上正确显示,但如果需要订阅所有每个人的属性上的所有属性更改事件,它将无法帮助您。

通常,当我拉动这么多项时,它用于报告,因此我不需要自己编辑项目,但需要根据过滤条件添加/删除报告中的行。