3

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

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

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

4

3 回答 3

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

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

于 2012-04-02T23:14:06.043 回答
0

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

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

于 2012-12-12T22:11:40.940 回答
0

我们也有同样的问题。我们的视图模型有一个太多的计算 observables,这导致脚本运行得更慢。删除不必要的订阅可能会使您摆脱这个问题。

于 2012-07-06T15:17:31.003 回答