私はオブザーバブルと計算されたオブザーバブルのグリッドを持っています。最初の行には、下のすべての行の値に対する乗数として使用されるパーセント率が含まれています。ユーザーはパーセンテージのレート値を編集でき、Knockoutはすべてのカスケード更新を処理できます。また、別のテキストボックスが必要です。ここで、ユーザーはグリッド内の各パーセンテージ率に適用される新しいパーセンテージ率を入力できます。ノックアウトにより、IEで "slow running script"という警告が発生する
初期結合作品罰金と1パーセント率の作品を更新するには、あまりにも結構です。
ユーザーが一致する割合率のそれぞれを更新ビューモデルを介してテキストボックスおよびIループに値を入力したときにJavaScriptの警告が発生します。グリッドの列は実際は月ごとの値なので、パーセント率を更新するループは12回しか実行されません。
私はスロットルエクステンダーを試してみましたが、それは問題を解決していませんでした。何か案は?
アップデート:それに役立つと確信して、私は
$("#NewRate").change(function (e) {
var newRate = parseFloat($(this).val());
for (var i = 0; i < 12; i++) {
viewModel.resourceCategory.monthAmounts[i].amount(newRate);
}
});
function ConvertToDate(jsonDateString) {
var re = /-?\d+/;
var m = re.exec(jsonDateString);
return new Date(parseInt(m[0]));
}
function MonthAmount(amount, dateKey) {
var self = this;
self.amount = ko.observable(amount).extend({ throttle: 1 }); //using the throttle to avoid "long running script" warning in IE
self.dateKey = ConvertToDate(dateKey);
self.monthIndex = self.dateKey.getMonth();
}
function ResourceCategory(name, monthAmounts) {
var self = this;
self.name = name;
self.monthAmounts = ko.utils.arrayMap(monthAmounts, function (monthAmount) {
return new MonthAmount(monthAmount.Amount, monthAmount.DateKey);
});
self.totalAmount = ko.computed(function() {
var sum = 0;
for (var i = 0; i < self.monthAmounts.length; i++) {
sum += parseFloat(self.monthAmounts[i].amount());
}
return sum.toFixed(2);
}).extend({ throttle: 1 }); //using the throttle to avoid "long running script" warning in IE
self.averageAmount = ko.computed(function() {
return (self.totalAmount()/self.monthAmounts.length).toFixed(2);
}).extend({ throttle: 1 }); //using the throttle to avoid "long running script" warning in IE
}
function ResourceCategoriesMonthTotal(monthIndex, resourceCategories) {
var self = this;
self.monthIndex = monthIndex;
self.dateKey = new Date(new Date().getFullYear(), monthIndex, 1);
self.amount = ko.computed(function() {
var val = 0;
for (var i = 0; i < resourceCategories.length; i++) {
val += parseFloat(resourceCategories[i].monthAmounts[self.monthIndex].amount());
}
return (val).toFixed(2);
}).extend({ throttle: 1 }); //using the throttle to avoid "long running script" warning in IE
}
self.resourceCategoriesMonthTotals = new Array();
for (var monthIndex = 0; monthIndex < 12; monthIndex++) {
self.resourceCategoriesMonthTotals.push(new ResourceCategoriesMonthTotal(monthIndex, self.resourceCategories));
}
self.resourceCategoriesTotal = ko.computed(function() {
var val = 0;
for (var i = 0; i < self.resourceCategoriesMonthTotals.length; i++) {
val += parseFloat(self.resourceCategoriesMonthTotals[i].amount());
}
return (val/self.resourceCategoriesMonthTotals.length).toFixed(2);
}).extend({ throttle: 1 }); //using the throttle to avoid "long running script" warning in IE
コードを投稿する必要があります。ここに行くことはあまりありません。 – arb
ループは12回しか実行されませんが、これらの12回の変更のたびにtotalAmount()が変化するような、多くのオブザーバブルが何度も繰り返されます。基本的に、これらの12回の反復では、おそらくdomを100回以上更新しています。 正確にはわかりませんが、その直前のすべての観察可能な評価を中断し、その後にレジュームすることができれば素晴らしいことでしょう。私はそれがIEで管理可能な時間に実行されると確信しています。 – AlexG
あなたはここで解決策を見つけることができます。 http://stackoverflow.com/questions/9121330/slow-executing-js-in-ie-and-ff/10535843#10535843 –