6

IE でのみ発生する "SCRIPT5002: Function expected" が表示されます。現在、バージョン 9 に対してテストしています。別の計算されたオブザーバブル内で以前に定義された計算されたオブザーバブルを使用すると発生します。

私のアプリケーションはこれよりも少し複雑なので、以下のより単純なコードでエラーを再現しました。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で 2 回呼び出されました。これは、IE<10 では、フィールドからオートコンプリート値を取得するための特別なコードが Knockout にあることが原因です。あなたの場合のようにフィールドが読み取り専用であっても、これを行います。ただし、autocomplete属性はチェックされます。したがって、次のように修正できます。

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

ここで Knockout にもバグがあります。つまり、双方向バインディングに渡された計算されたオブザーバブルが上書きされます。これは、バージョン 2.3.0 (おそらく 2013 年 4 月) としてリリースされる Knockout の開発バージョンで既に修正されています。これを回避するには、次のように、計算されたオブザーバブル自体ではなく、オブザーバブルの値をバインディングに渡すことができます。

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

オブザーバブルにパラメーターとして渡される値があるかどうかを確認してください。たとえば、budgetlineviewmodel.total = total(5) です。Budgetlineviewmodel.total = 5 を使用してみましたが、成功しませんでした。

Knockout Observables は内部的に関数にすぎず、内部的に同じ値を返す括弧内に値を渡す必要があります。

Chrome は、パラメータが渡されない場合、budgetlineviewmodel.total() が null 値を許容できるように寛容です。

お役に立てれば。

乾杯 !

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