2012-04-25 8 views
3

私はオブザーバブルと計算されたオブザーバブルのグリッドを持っています。最初の行には、下のすべての行の値に対する乗数として使用されるパーセント率が含まれています。ユーザーはパーセンテージのレート値を編集でき、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 
+1

コードを投稿する必要があります。ここに行くことはあまりありません。 – arb

+1

ループは12回しか実行されませんが、これらの12回の変更のたびにtotalAmount()が変化するような、多くのオブザーバブルが何度も繰り返されます。基本的に、これらの12回の反復では、おそらくdomを100回以上更新しています。 正確にはわかりませんが、その直前のすべての観察可能な評価を中断し、その後にレジュームすることができれば素晴らしいことでしょう。私はそれがIEで管理可能な時間に実行されると確信しています。 – AlexG

+0

あなたはここで解決策を見つけることができます。 http://stackoverflow.com/questions/9121330/slow-executing-js-in-ie-and-ff/10535843#10535843 –

答えて

2

[OK]を、これは臭いが、私はこの問題は、私は私のページでこれを持っていたということだと思う:

<div data-bind="text: ko.toJSON($root)"></div> 

私はそれが私に「スローランニングスクリプト」警告を与えていないことを取り除いた後。

2

が問題のような音、いくつかのコードを追加していないあなたはビューモデルによる

ループのそれぞれを更新する場合であります一致する率率

もしそうなら、IEのための1つの答えは、タイムアウト(0)呼び出しを使用してブラウザに伝えることです。タイムアウト後にJSが再開したら、ループの次の反復を行い、次に別のタイムアウトを実行します。私はこれをやった

私はそれがIEのブラウザであることを盗聴した場合、私はタイムアウトを行います。それ以外の場合は必要ありません。

+0

私は、更新ループでこれを入れてみましたが、それはdidnの'助けて: 'setTimeout(function(){viewModel.costCenterOverheadRate.monthAmounts [i] .amount(newRate);}、0);' – Homer

+0

そうだね。申し訳ありませんが動作しませんでした。 IEの問題の原因を特定できるようになるまで、他の変更を加えてみてください。 –

+0

私はそれを実行するときに1つの同期ブロックで12の呼び出しをすべて実行していると思います。代わりに、後続のsetTimeoutで常に次の量を設定するシーケンスとしてコード化できますか? – AlexG

関連する問題