Javascript 敲除计算仅在IE中给出函数预期错误

Javascript 敲除计算仅在IE中给出函数预期错误,javascript,internet-explorer,knockout.js,knockout-2.0,Javascript,Internet Explorer,Knockout.js,Knockout 2.0,我得到了一个“SCRIPT5002:Function expected”,它只在IE中出现。我目前正在针对版本9进行测试。当我在另一个计算的可观察对象中使用先前定义的计算的可观察对象时,就会发生这种情况 我的应用程序比这个复杂一点,所以我用下面简单得多的代码重现了这个错误。错误发生在z=self.subtotal()行当您为编号1、编号2和编号3(以及制表符输出)输入一个数字时 这个错误在Chrome或Firefox中都没有出现,我在谷歌搜索了很长一段时间。希望有人能帮我摆脱困境 以下是指向JS

我得到了一个“SCRIPT5002:Function expected”,它只在IE中出现。我目前正在针对版本9进行测试。当我在另一个计算的可观察对象中使用先前定义的计算的可观察对象时,就会发生这种情况

我的应用程序比这个复杂一点,所以我用下面简单得多的代码重现了这个错误。错误发生在
z=self.subtotal()行当您为编号1、编号2和编号3(以及制表符输出)输入一个数字时

这个错误在Chrome或Firefox中都没有出现,我在谷歌搜索了很长一段时间。希望有人能帮我摆脱困境

以下是指向JSFIDLE的链接:

下面是javascript:

    function putVars() {
    self = this;
    self.number1 = ko.observable();
    self.number2 = ko.observable();
    self.subtotal = ko.computed(function () {
        return parseFloat(self.number1()) + parseFloat(self.number2());
    }, self, { deferEvaluation: true });

    self.number3 = ko.observable();
    self.number4 = ko.observable();
    self.total = ko.computed(function () {
        var x, y, z;
        x = self.number3();
        y = self.number4();
        z = self.subtotal();
        return parseFloat(x) + parseFloat(y) + parseFloat(z);
    }, self, { deferEvaluation: true });
}

$(function () {
    ko.applyBindings(new putVars());
});
以下是html:

    <h4>Calc 1</h4>
<label for="Number1">Number 1: </label><input id="Number1" type="text" data-bind="value: number1" />
<label for="Number2">Number 2: </label><input id="Number2" type="text" data-bind="value: number2" />
<label for="Subtotal"><b>Subtotal: </b></label><input id="Subtotal" type="text" data-bind="value: subtotal" readonly="readonly" />
<hr />
<h4>Calc 2</h4>
<label for="Number3">Number 3: </label><input id="Number3" type="text" data-bind="value: number3" />
<label for="Number4">Number 4: </label><input id="Number4" type="text" data-bind="value: number4" />
<label for="Total"><b>Total:</b> </label><input id="Total" type="text" readonly="readonly" data-bind="value: total" />
Calc 1
第一:
第二点:
小计:

计算2 第三点: 第四点: 总数:
您似乎在IE或KnockoutJS中发现了一个bug,可能是由Knockout的绑定暴露出来的,Knockout将一个值推送到一个可观察对象中,但在IE9中,它覆盖了属性

这在IE10上没有发生,表明这是IE9中的一个bug。我猜Knockout在检查某个值是否是可写的可观察函数,以及它是否在IE9上被错误地报告

有趣的是,如果更改为使用读/写,错误将停止:

self.subtotal = ko.computed({
     read: function() { 
         return parseFloat(this.number1()) + parseFloat(this.number2());
     },
     write: function(val) { }
}, self);

也许这是一个足够的解决方法?

这有一个与此类似的原因:在IE中,请检查您的observable是否有一个值作为参数传递。例如,budgetlineviewmodel.total=total(5)。我已尝试使用budgetlineviewmodel.total=5。但是没有成功

敲除观测值在内部只是函数,必须在括号内传递一个值,该值在内部返回相同的值

Chrome允许budgetlineviewmodel.total()在未传递任何参数时允许空值

希望这有帮助

干杯

budgetlineviewmodel.Save = function () {        
        var currentTotalAmt = $('#txtTotal').val();
        budgetLineViewModel.Total(currentTotalAmt);
}

这项工作绝对可以。非常感谢你的帮助!感谢您对这些问题进行了更清晰的解释,并提供了更简洁的解决方案。在看到这个选项之前,我已经实施了犹大的解决方案,并出于与本次讨论无关的其他原因离开了它。我相信这是一个更准确的答案。有一个类似的问题,并且能够通过使用第二个修复来修复它,将
()
放在
数据绑定中的值上。找到那个真是太好了。
<input id="Subtotal" type="text" data-bind="value: subtotal()" readonly="readonly" />
budgetlineviewmodel.Save = function () {        
        var currentTotalAmt = $('#txtTotal').val();
        budgetLineViewModel.Total(currentTotalAmt);
}