「実際の値」の ko.observables (つまり、数量、価格、および合計) を作成し、フォーム フィールドでフォーカス イベントを追跡し、ko.computed() を使用して再計算することで、同様のことを行いました (ただし、現在のフィールドが選択されている場合)、フォームの値を書式設定します。
この 1 文の説明は複雑に聞こえますが、コード的にはそれほど複雑ではありません。
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でコーディングしてください。