ユーザーは、通常のパーセンテージとして慣れている 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 つのソリューションが同時に適用されることはないため、衝突することはありません。