我会在其中添加几个计算出的 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"/>