私は、同時に使用できるエクステンダコードをいくつか持っています。 Numeric with Rangeを拡張しようとすると、問題は解決されません。ここでノックアウトエクステンダが同時に動作しない
ko.extenders.numeric = function (target, precision) {
//create a writable computed observable to intercept writes to our observable
var result = ko.pureComputed({
read: target, //always return the original observables value
write: function (newValue) {
var current = target(),
roundingMultiplier = Math.pow(10, precision),
newValueAsNum = isNaN(newValue) ? 0 : parseFloat(+newValue),
valueToWrite = Math.round(newValueAsNum * roundingMultiplier)/roundingMultiplier;
//only write if it changed
if (valueToWrite !== current) {
target(valueToWrite);
} else {
//if the rounded value is the same, but a different value was written, force a notification for the current field
if (newValue !== current) {
target.notifySubscribers(valueToWrite);
}
}
}
}).extend({ notify: 'always' });
//initialize with current value to make sure it is rounded appropriately
result(target());
//return the new computed observable
return result;
};
は別のエクステンダーです...ここで
ko.extenders.range = function (target, intRange) {
//create a writeable computed observable to intercept writes to our observable
var result = ko.computed({
read: target, //always return the original observables value
write: function (newValue) {
alert(target());
var current = target(),
newValueAsNum = isNaN(newValue) ? 0 : parseInt(+newValue, 10),
valueToWrite = newValueAsNum;
if (newValueAsNum < intRange.min) {
valueToWrite = intRange.min;
}
if (newValueAsNum > intRange.max) {
valueToWrite = intRange.max;
}
//only write if it changed
if (valueToWrite !== current) {
target(valueToWrite);
} else {
//if the tested value is the same, but a different value was written, force a notification for the current field
if (newValue !== current) {
target.notifySubscribers(valueToWrite);
}
}
}
}).extend({ notify: 'always' });
//initialize with current value to make sure it is rounded appropriately
result(target());
//return the new computed observable
return result;
};
は私のバイオリンは、ここでhttps://jsfiddle.net/xequence/0nL09w55/
ある問題の実装
var InitializePanelsApplicantViewModel = function() {
this.CoverageLimit = ko.observable('').extend({required: true}).extend({numeric: 2}),
this.CoverageLimitFailWhyCry = ko.observable('').extend({required: true}).extend({numeric: 2}).extend({range : 500});
};
$(function(){
var masterVM = (function() {
this.InitializePanelsApplicantViewModel = new InitializePanelsApplicantViewModel();
})();
ko.applyBindings(masterVM);
});
私がparseIntを使用していて、parseFloatを使用していないことを明確にしていただきありがとうございます。 pureComputedに関しては、それは現時点では私にとって新しく、ko.computedの提案を使用していたはずです。 – Programmer