javascript - 在 IE 中导致 "slow running script"警告的 knockout

标签 javascript internet-explorer knockout.js

我有一个可观察值和已计算可观察值的网格。第一行包含用作下面所有行中值的乘数的百分比。用户可以编辑百分比值,Knockout 会处理所有级联更新。我还需要一个单独的文本框,用户可以在其中输入将应用于网格中每个百分比的新百分比。

初始绑定(bind)工作正常,更新 1 个百分比的费率也工作正常。

当用户在文本框中输入一个值并且我遍历 View 模型更新每个百分比以匹配时,会出现 javascript 警告。网格列实际上是月度值,因此更新百分比的循环仅执行 12 次。

我试过 throttle 延长器,但没有解决问题。有什么想法吗?

更新:不确定它是否有帮助,但我添加了一些代码

$("#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

最佳答案

听起来问题出在你身上

loop through the view model updating each of the percentage rates to match

如果是这样,那么 IE 的一个答案是使用 timeout(0) 调用屈服于浏览器。当您的 JS 在超时后恢复时,执行循环的下一次迭代,然后再超时。

完成此操作后,如果我嗅探到它是 IE 浏览器,我只会执行超时。否则,不需要。

关于javascript - 在 IE 中导致 "slow running script"警告的 knockout ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10316957/

相关文章:

javascript - 在 jQuery 文档准备好之前在窗口上强制执行 DOMContentLoaded 事件

javascript - IE 问题与 HTML5 headers.char utf-8 编码显示为错误

css - 使用 IE-CSS3 htc 调整浏览器大小时的框定位样式

javascript - 如何使用knockout JS 验证日期(年份)?

javascript - 如何加载到特定路径

javascript - 如何在没有错误的情况下访问catch javascript

javascript - 使用 knockout 和 typescript 。如何从订阅中更改 Observable 的值?

javascript - asp.net MVC 与 MVVM 通过 Knockout,将模型传递给 javascript

javascript - 你如何掌控一个复杂的 JavaScript 项目?

javascript - 意识到 Javascript 表示数组的独特方式的排序