私が構築している最近のKnockoutインターフェースで、自動保存を設定しようとしました。変更を停止してから1秒後に保存が行われるように設計されています。
ここに問題があります。デフォルトでは、KOは入力のblurイベントに依存してviewModelを更新します。箱から出してクリックする前にページを離れたりブラウザを更新したりすると、私のインターフェースはデータを保存しません。
これを解決するためにvalueUpdate: 'afterkeydown'
、すべての文字列入力で機能するを有効にしました。ただし、常に数値が含まれるように拡張された数値のPricePerLFフィールドがあります。ここにある推奨エクステンダーを使用しました。
ko.extenders.numeric = function(target, precision) {
//create a writeable computed observable to intercept writes to our observable
var result = ko.computed({
read: target, //always return the original observables value
write: function(newValue) {
var current = target(),
roundingMultiplier = Math.pow(10, precision),
newValueAsNum = isNaN(newValue) ? 0 : parseFloat(+newValue),
valueToWrite = Math.round(newValueAsNum * roundingMultiplier) / roundingMultiplier;
//only write if it changed
if (valueToWrite !== current) {
target(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) {
target.notifySubscribers(valueToWrite);
}
}
}
});
//initialize with current value to make sure it is rounded appropriately
result(target());
//return the new computed observable
return result;
};
この数値エクステンダーをどのようにうまく機能させることができますvalueUpdate: 'afterkeydown'
か?2.80
また、の代わりに、などの特定の数の小数点を表示するように強制することもできます2.8
。