javascript – Knockout computed仅在IE中给出函数预期错误

我得到一个“SCRIPT5002:功能预期”,只发生在IE中.我正在测试版本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);
    },{ 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" />

解决方法

这有一个类似的原因: knockout.js Computed observable called twice in Internet Explorer并且是由于在IE< 10中,Knockout有一些特殊的代码来处理从字段中获取自动完成值的事实.即使字段是只读的,它也会这样做.但是,它会检查autocomplete属性.所以你可以像这样解决它:
<input id="Subtotal" type="text" data-bind="value: subtotal" autocomplete="off" readonly="readonly" />

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

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

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...