我将observableArray绑定到列表。
每当我添加少量元素时,列表都会更新。
但是在我执行了几次之后,脚本警报就会停止/继续运行脚本。
我每次只绑定50行(Id,Name对)。 我认为ko一次又一次地绑定列表。
可以停止吗? 有人可以帮帮我吗?
答案 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);