在我最近构建的一个 Knockout 界面中,我尝试设置自动保存。它的设计目的是在您停止更改后 1 秒进行保存。
这就是问题所在。默认情况下,KO 依赖输入上的模糊事件来更新 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
.