0

たとえば、次のようになります。

<input type="text" data-bind="value: num1, valueUpdate: 'keyup'"/>
<input type="text" data-bind="value: num2, valueUpdate: 'keyup'"/>
<input type="text" data-bind="value: total"/>


var viewModel = {
    num1: ko.observable(0),
    num2: ko.observable(0)
};

viewModel.total = ko.computed(function () {
    return parseFloat(viewModel.num1()) + parseFloat(viewModel.num2());
}, viewModel);

ko.applyBindings(viewModel);

含まれているかどうかnum1を確認することはできますか?はいの場合、計算する前にに置き換える必要があります。num2,.viewModel.total

これどうやってするの?

4

3 に答える 3

2

このフィドルは、 ko エクステンダーを使用してオブザーバブルに拡張機能を適用するソリューションを示しています。

于 2012-09-20T19:55:01.060 に答える
2

解析を行うために、そこにいくつかの計算されたオブザーバブルを追加します。

    var viewModel = {  
        num1: ko.observable(0),  
        num2: ko.observable(0)  
    };  

   viewModel.num1Parsed = ko.computed(function () {  
        return viewModel.num1().replaceAll(',', '.');  
    }, viewModel);  

   viewModel.num2Parsed = ko.computed(function () {  
        return viewModel.num2().replaceAll(',', '.');  
    }, viewModel);  

    viewModel.total = ko.computed(function () {  
        return parseFloat(viewModel.num1Parsed()) + parseFloat(viewModel.num2Parsed());  
    }, viewModel);  

replaceAll には次の関数を使用します。

/** 
* ReplaceAll by Fagner Brack (MIT Licensed) 
* Replaces all occurrences of a substring in a string 
*/
String.prototype.replaceAll = function (token, newToken, ignoreCase) {
    var str, i = -1, _token;
    if ((str = this.toString()) && typeof token === "string") {
        _token = ignoreCase === true ? token.toLowerCase() : undefined;
        while ((i = (
        _token !== undefined ?
            str.toLowerCase().indexOf(
                        _token,
                        i >= 0 ? i + newToken.length : 0
            ) : str.indexOf(
                        token,
                        i >= 0 ? i + newToken.length : 0
            )
    )) !== -1) {
            str = str.substring(0, i)
                .concat(newToken)
                .concat(str.substring(i + token.length));
        }
    }
    return str;
};

または、HTML の num1 および num2 オブザーバブルを、値が書き込まれるときに解析する計算されたものに置き換えることもできます。

    this.num1Parsed = ko.dependentObservable({
        read: function () {
            return viewModel.num1();
        },
        write: function (value) {
            viewModel.num1(value.replaceAll(',', '.'));
        },
        owner: this
    });

    this.num2Parsed = ko.dependentObservable({
        read: function () {
            return viewModel.num2();
        },
        write: function (value) {
            viewModel.num2(value.replaceAll(',', '.'));
        },
        owner: this
    });

.. 次に、HTML を次のように変更します。

<input type="text" data-bind="value: num1Parsed, valueUpdate: 'keyup'"/>             
<input type="text" data-bind="value: num2Parsed, valueUpdate: 'keyup'"/>             
<input type="text" data-bind="value: total"/>     
于 2012-09-20T14:20:56.113 に答える
0

はい。最も簡単な方法は、次のような Javascripts 文字列置換関数を呼び出すことです。

var temp1 = viewModel.num1().replace(',','.');

これはコンマを探すだけでなく、同時に見つかった場合は置き換えます。

注: float にはピリオドが 1 つしかないため、これは 1 つのコンマでのみ機能します。他のカンマまたはピリオドが挿入されている場合、カンマ/ピリオドの後の数字は無視されます。

たとえば、フィドルを参照してくださいhttp://jsfiddle.net/Rynan/LYzhx/

于 2012-09-20T14:23:46.243 に答える