Javascript 如何显示与用于计算的值不同的值

Javascript 如何显示与用于计算的值不同的值,javascript,knockout.js,Javascript,Knockout.js,用户输入一个0-100范围内的百分比值,该值被用作正常百分比 但是,当这些值用于计算时,它们需要在0-1范围内,因此除以100,以便可以直接用于计算 我使用Math.round(value*100)/10000除以100,因此数字将四舍五入为2位数字 一种解决方案使用数据绑定: ko.bindingHandlers.percent = { init: function (element, valueAccessor) { $(element).change(functio

用户输入一个0-100范围内的百分比值,该值被用作正常百分比

但是,当这些值用于计算时,它们需要在
0-1
范围内,因此除以100,以便可以直接用于计算

我使用
Math.round(value*100)/10000
除以100,因此数字将四舍五入为2位数字

一种解决方案使用数据绑定:

ko.bindingHandlers.percent = {
    init: function (element, valueAccessor) {
        $(element).change(function () {
            DEBUG && log('Percent changed: ' + $(this).number() + ' saved as: ' + $(this).number() / 100);
            valueAccessor()(Math.round($(this).number({ round: false }) * 100) / 10000);
        });
    },
    update: function (element, valueAccessor) {
        var value = ko.utils.unwrapObservable(valueAccessor());
        DEBUG && log('Percent changed: ' + value + ' displayed as: ' + value * 100);
        $(element).val(Math.round(value * 10000) / 100);
    }
};
但这会导致显示的值是用户输入值的100倍

所以看起来除以100的情况没有发生

正在通过
databind=“percent
属性应用
bindinghandler

另一个解决方案使用额外的扩展器:

obj.Property.extend({ AdvancedCalculation: null, Percent: null }); // Already tried flipping the order of these extenders.

ko.extenders.Percent = function (target) {
    var result = ko.computed({
        read: function () {
            DEBUG && log('Value in model: ' + target());
            return Math.round(target() * 10000) / 100; // Show
        },
        write: function (value) {
            DEBUG && log('Save user input: ' + value);
            return Math.round(value * 100) / 10000; // To database
        }
    });

    return result;
}

ko.extenders.AdvancedCalculation = function (target) {
    target.subscribe(function (value) {
        DEBUG && log('Value in model ' + value);
        // calculate some other stuff.
    });

    return target;
};
但是先进的计算技术并不能得到除以100的值

此外,保存数据的控制器将获取用户在浏览器中输入的值,而不是除以100的值

用户还应该能够同时使用和。指示点数

(例如:
5.4%或5,4%

这将用于输入利率


这两个解决方案不会同时应用,因此它们不会发生冲突。

本质上,您试图为一个属性设置两个不同的值。而且你似乎没有一个明确的语义方式来区分你真正想要的是哪一个

试着做一些简单的事情,这样就行了

  • 在百分比中有一个属性,该属性是持久的,并且
  • 以单位值设置第二个属性(只读)

对这样的一些对象调用这些属性
rateecent
ratemunity
。你可能会发现有一个
ratemplier
或者类似的东西是很有用的,1.00+ratemunity。

事实上,我认为有另一个变量会让事情变得更复杂。但这应该会让事情变得更好。你需要绝对清楚地区分你所指的值/缩放比例——因此,在编译器和语言术语中,它们是分开的。如果你想做一个OO解决方案,你可以有一个同时具有PercentValue和UnitaryValue属性的“PercentValue”类。