0

ユーザーは、通常のパーセンテージとして慣れている 0 ~ 100 の範囲のパーセント値を入力します。

ただし、これらの値を計算に使用する場合は0-1、計算で直接使用できるように、100 で割った範囲内にある必要があります。

Math.round(value * 100) / 10000数値が 2 桁に丸められるように、100 で割ります。

1 つのソリューションでは、データバインディングを使用します。

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 による除算は行われていないようです。

bindinghandlerを通じて適用されていdatabind="percentます:Property".

別のソリューションでは、追加のエクステンダーを使用します。

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% or 5,4%)。

これは、金利を入力するために使用されます。

2 つのソリューションが同時に適用されることはないため、衝突することはありません。

4

1 に答える 1

1

基本的に、1 つのプロパティに対して 2 つの異なる値を取得しようとしています。また、実際に取得することを期待するものを区別する明確なセマンティックな方法がないようです。

簡単なことをやってみてください。

  • パーセンテージで 1 つのプロパティを持ち、永続化され、
  • 2 番目のプロパティ (読み取り専用) を単位値で設定します。

これらのプロパティRatePercentRateUnitary何かを呼び出します。RateMultiplier1.00 + RateUnitary である a または some such があると便利な場合もあります。

于 2013-07-10T10:14:50.760 に答える