knockout.js KnockoutJS扩展程序不会使用相同的值再次格式化

uttx8gqw  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(92)

我使用以下扩展程序:

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链接。

ryoqjall

ryoqjall1#

问题是计算出的可观察目标.formatted没有改变,如果它没有改变,KO就不会更新链接的输入。
解决方案是将下列扩充项加入至target.formatted:
.extend({通知:“总是”});
这会迫使KO认为target.formatted具有新值,因此会用格式化的输入覆盖您的输入。

相关问题