6

我得到一个只在 IE 中发生的“SCRIPT5002:预期功能”。我目前正在针对版本 9 进行测试。当我在另一个计算的 observable 中使用先前定义的计算 observable 时会发生这种情况。

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

这个错误在 Chrome 或 Firefox 中不会发生,我已经用谷歌搜索了很长一段时间。希望有人能帮我解开。

这是 jsfiddle 的链接:http: //jsfiddle.net/kCmTg/

这是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" />
4

3 回答 3

7

这与这个原因类似:knockout.js Computed observable 在 Internet Explorer 中调用了两次,这是由于在 IE<10 中,Knockout 有一些特殊的代码来处理从字段中获取自动完成值。即使在您的情况下该字段是只读的,它也会这样做。但是,它会检查autocomplete属性。所以你可以像这样修复它:

<input id="Subtotal" type="text" data-bind="value: subtotal" autocomplete="off" readonly="readonly" />

这里还有一个Knockout中的错误——它将覆盖传递给双向绑定的计算 observable。这已经在 Knockout 的开发版本中修复,将作为 2.3.0 版发布(可能在 2013 年 4 月)。要解决这个问题,您可以将 observable 的值传递给绑定,而不是计算出的 observable 本身,如下所示:

<input id="Subtotal" type="text" data-bind="value: subtotal()" readonly="readonly" />
于 2013-03-02T02:43:19.163 回答
3

您似乎在 IE 或 KnockoutJS 中发现了一个错误,可能是由 Knockout 的绑定暴露的,其中 Knockout 将一个值推送到可观察对象中,但在 IE9 中,它会覆盖该属性。

这在 IE10 上不会发生,这表明它是 IE9 中的错误。我猜 Knockout 有一些东西可以检查某个值是否是可写的可观察函数,并且它在 IE9 上被错误地报告。

有趣的是,如果您将 KO 计算更改为使用读/写,错误就会停止:

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

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

于 2013-03-01T22:31:29.943 回答
0

请检查您的 observable 是否有一个值作为参数传递。例如budgetlineviewmodel.total = total(5)。我试过使用budgetlineviewmodel.total = 5。但没有成功。

Knockout Observables 只不过是内部函数,您必须在括号内传递一个值,该值在内部返回相同的值。

Chrome 允许budgetlineviewmodel.total() 在没有传递参数时容忍空值。

希望这可以帮助。

干杯!

budgetlineviewmodel.Save = function () {        
        var currentTotalAmt = $('#txtTotal').val();
        budgetLineViewModel.Total(currentTotalAmt);
}
于 2015-05-05T12:38:19.340 回答