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

我会在其中添加几个计算出的 observable 来进行解析:

    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 回答
2

这个小提琴说明了一个使用ko 扩展器将扩展应用到可观察对象的解决方案。

于 2012-09-20T19:55:01.060 回答
0

是的。最简单的方法是调用 Javascripts 字符串替换函数,例如

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

这不仅会查找逗号,还会在同时找到时替换它。

注意:这仅适用于单个逗号,因为浮点数应该只有一个句点。如果插入任何其他逗号或句点,则逗号/句点后面的数字将被忽略。

参见小提琴例如http://jsfiddle.net/Rynan/LYzhx/

于 2012-09-20T14:23:46.243 回答