Ich habe einige Extender-Code, den ich gerne gleichzeitig verwenden könnte. Das Problem ist nicht funktionieren, wenn ich versuche, Numerisch mit Bereich zu erweitern.Knockout-Extender nicht gleichzeitig
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;
};
Hier ist eine weitere Verlängerung ist ...
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;
};
Hier ist meine Geige https://jsfiddle.net/xequence/0nL09w55/
Hier wird der säumige Implementierung
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);
});
Vielen Dank für die Klärung, dass ich parseInt und nicht parseFloat verwendet habe. Was die pureComputed anbelangt, war sie im Moment etwas zu neu für mich und hätte deinen Vorschlag von ko.computed verwenden sollen. – Programmer