我使用以下扩展程序:
var toMoney = function (val, decimals) {
return Number(val).toFixed(decimals).replace(/(\d)(?=(\d{3})+\.)/g, '$1\'');
};
function formatToNumber(str, decimals) {
var roundingMultiplier = Math.pow(10, decimals);
//Strip out everything except numbers and decimals (also strip out '%' and 'R')
var newValueAsNum = new String(str).replace(/[^0-9\.]/g, '');
if (isNaN(newValueAsNum)) {
//can happen with two decimals.
newValueAsNum = 0;
}
var valueToWrite = Math.round(newValueAsNum * roundingMultiplier) / roundingMultiplier;
return valueToWrite;
}
//Add formatted observable to the target observable.
ko.extenders.addCurrencyFormatted = function (target, decimals) {
target.formatted = ko.computed({
read: function () {
var val = target();
//Insert 1000 space.
if (val != null) {
var formattedValue = toMoney(val, decimals);
return formattedValue;
}
return "";
},
write: function (newValue) {
var current = target();
var valueToWrite = formatToNumber(newValue, decimals);
//only write if it changed
if (valueToWrite !== current) {
target(valueToWrite);
} else {
if (valueToWrite === current) {
if (newValue !== current) {
target.notifySubscribers(valueToWrite);
}
}
}
});
return target;
};
如果我在输入中写入1000,它会格式化为1'000.00。但是如果我再次写入1000,它会保持原样。我错了什么?
我从这个source中得到了代码,在评论中也有一个jsfidle链接。
1条答案
按热度按时间ryoqjall1#
问题是计算出的可观察目标.formatted没有改变,如果它没有改变,KO就不会更新链接的输入。
解决方案是将下列扩充项加入至target.formatted:
.extend({通知:“总是”});
这会迫使KO认为target.formatted具有新值,因此会用格式化的输入覆盖您的输入。