書き込み中の値が変更されていない場合でも、オブザーバブルが書き込み時に常に通知することがありました。私は KO 1.21 を信じているので、実際の値が変更されていない場合、オブザーバブルは通知を抑制します。
簡単な解決策はvalueHasMutated
、オブザーバブルを呼び出して、通知が確実に送信されるようにすることです。
計算されたオブザーバブルを記述するためのより良い方法は、次のようになります。
//writable computed to parse currency input
this.editPrice = ko.computed({
//return a formatted price
read: function() {
return viewModel.formatCurrency(this.price());
},
//if the value changes, make sure that we store a number back to price
write: function(newValue) {
var current = this.price(),
valueToWrite = viewModel.parseCurrency(newValue);
//only write if it changed
if (valueToWrite !== current) {
this.price(valueToWrite);
} else {
//if the rounded value is the same, but a different value was written, force a notification for the current field
if (newValue !== current) {
this.price.valueHasMutated();
}
}
},
owner: this
});
この場合、解析された値が異なる場合にのみオブザーバブルに書き込み、ユーザーが現在の値とは異なる値を入力した場合にのみ通知を強制します。これにより、ユーザーが現在の価格に四捨五入する値を入力した場合でも、フィールドが更新されます。
更新されたサンプルは次のとおりです: http://jsfiddle.net/rniemeyer/6A4aN/