我通过制作“真实价值”ko.observables(即数量、价格和总计)、跟踪表单字段上的焦点事件以及使用 ko.computed() 重新计算(但如果当前字段被选中)并格式化表单的值。
一句话描述听起来很复杂,但在代码方面并没有那么复杂。
JavaScript:
var Model = function () {
var self = this;
self.quantity = ko.observable(0);
self.price = ko.observable(0);
self.price.selected = ko.observable(false);
self.total = ko.observable(0);
self.total.selected = ko.observable(false);
self.formattedPrice = ko.computed({
read: function () {
if (!self.price.selected()) {
var total = self.total() || 0;
var quantity = self.quantity() || 0;
var value = total / quantity;
self.price(isNaN(value) ? 0 : value);
}
return '$' + self.price().toFixed(2);
},
write: function (value) {
value = parseFloat(value.replace(/[^\.\d]/g, ""));
self.price(isNaN(value) ? 0 : value);
}
});
self.formattedTotal = ko.computed({
read: function () {
if (!self.total.selected()) {
var quantity = self.quantity() || 0;
var price = self.price() || 0;
var value = quantity * price;
self.total(isNaN(value) ? 0 : value);
}
return '$' + self.total().toFixed(2);
},
write: function (value) {
value = parseFloat(value.replace(/[^\.\d]/g, ""));
self.total(isNaN(value) ? 0 : value);
}
});
};
ko.applyBindings(new Model());
在 HTML 中,您可以像这样绑定价格和总计:
<input data-bind="value: formattedPrice, hasfocus: price.selected" />
<input data-bind="value: formattedTotal, hasfocus: total.selected" />
如果您想查看一个工作示例,请在jsfiddle 编写代码。