在元素添加上停止敲除重新绑定

时间:2013-08-03 11:14:37

标签: javascript asp.net-mvc knockout-2.0

我将observableArray绑定到列表。

每当我添加少量元素时,列表都会更新。

但是在我执行了几次之后,脚本警报就会停止/继续运行脚本。

我每次只绑定50行(Id,Name对)。 我认为ko一次又一次地绑定列表。

可以停止吗? 有人可以帮帮我吗?

1 个答案:

答案 0 :(得分:0)

您遇到的问题是由于javascript的单线程特性。如果有一个需要花费大量时间执行的函数,浏览器将警告用户是否终止它以防止它控制浏览器的执行。在您的情况下,我猜您使用push函数添加了许多行,这会导致每个项目的DOM更新并花费大量时间。要优化它,请尝试ko.utils.arrayPushAll

 var yourArray = ko.observableArray();    
 //assume yourArray here is your observableArray
 ko.utils.arrayPushAll(yourArray(), data);//data here is the array you need to add to yourArray 
 yourArray.valueHasMutated();//this line notifies the subscribers to update

这将确保observableArray(yourArray)的订阅者只被通知一次而不是每次推送

有关详细信息,请查看this link

即使您已应用该方法,仍然存在性能问题。您可以使用setTimeout将执行分解为许多小块来避免此问题。像这样:

var yourArray = ko.observableArray(); 

var totalItem = data.length;
var itemPerExecution = 20; //process only 20 items in 1 execution
var processedItem = 0; 
setTimeout(function generateRows(){
      var smallData = data.slice(processedItem,itemPerExecution);
      ko.utils.arrayPushAll(yourArray(), smallData);
      yourArray.valueHasMutated();

      processedItem+=itemPerExecution;
      if (processedItem < totalItem ){
          setTimeout(generateRows,0);
      }
},0);