用敲击映射插头限制

时间:2012-03-29 23:56:58

标签: jquery knockout.js knockout-mapping-plugin

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

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

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

3 个答案:

答案 0 :(得分:2)

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的执行,直到当前调用结束。这意味着非常短的工作单元不会超时浏览器。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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