Есть ли способ продлить валидацию в validatedObservable Knockout Validation?
Мне нужно убедиться, что каждая наблюдаемая действительна, а также убедиться, что все наблюдаемые действительны вместе. В моем упрощенном примере у меня есть modelNumber и stockNumber, которые требуются каждый, но вместе они также должны сформировать правильный partNumber. Моя попытка дает мне эту ошибку:
"Uncaught Error: невозможно записать значение в ko.computed, если вы не укажете опцию" write ". Если вы хотите прочитать текущее значение, не передавайте никакие параметры".
В чем проблема?
https://jsfiddle.net/yekr2ov2/18/
// enable validation
ko.validation.init();
ko.validation.rules['partNumberValid'] = {
validator: function(partInfo, otherVal) {
return partInfo.modelNumber() + partInfo.stockNumber() == "m1s1";
},
message: 'part number is invalid'
};
ko.validation.registerExtenders();
function VM() {
var self = this;
self.modelNumber = ko.observable().extend({ required: true });
self.stockNumber = ko.observable().extend({ required: true });
self.vinNumber = ko.observable().extend({ required: true });
self.isPartNumberValid = ko.validatedObservable({
modelNumber: self.modelNumber,
stockNumber: self.stockNumber,
vinNumber: self.vinNumber
}).extend({ partNumberValid: true });
self.message = ko.observable();
self.save = function() {
if (self.isPartNumberValid.isValid()) {
self.message("saved");
}
else {
debugger;
//self.isPartNumberValid.errors.showAllMessages();
self.message("not saved");
}
};
}
ko.applyBindings(new VM());
2 ответа
Я изменил код и следующий код работает нормально.
ko.validation.init();
ko.validation.rules['partNumberValid'] = {
validator: function (partInfo, otherVal) {
return partInfo.modelNumber() +''+ partInfo.stockNumber() === "m1s1";
},
message: 'part number is invalid'
};
ko.validation.registerExtenders();
function VM() {
var self = this;
self.modelNumber = ko.observable().extend({required: true});
self.stockNumber = ko.observable().extend({required: true});
self.isPartNumberValid = ko.observable({
modelNumber:self.modelNumber,
stockNumber:self.stockNumber
}).extend({partNumberValid:true});
self.validateMe = ko.computed(function(){
write:{
var tes = ko.validation.group([self.modelNumber,self.stockNumber,self.isPartNumberValid]);
tes.showAllMessages(true);
}
});
}
ko.applyBindings(new VM());
Скрипка: https://jsfiddle.net/yekr2ov2/7/ я использовал ko.validation.group для проверки наблюдаемых и вычислил для проверки немедленно. Вы можете заменить вычисленное нажатием кнопки или любой другой пользовательской функцией. Дайте мне знать, если это поможет.
благодарю вас
Я думаю, что ответом является то, что вы не можете продлить валидацию в validatedObservable Knockout Validation. Я думаю, что правильный ответ здесь заключается в создании observable
для каждой вещи или группы вещей, которые нуждаются в проверке, а затем создать validatedObservable
чтобы проверить все эти observables
,
https://jsfiddle.net/yekr2ov2/17/
ko.validation.init();
ko.validation.rules['partNumberValid'] = {
validator: function(partInfo, otherVal) {
return partInfo.modelNumber() + partInfo.stockNumber() === "m1s1";
},
message: 'part number is invalid'
};
ko.validation.registerExtenders();
function VM() {
var self = this;
self.modelNumber = ko.observable().extend({ required: true });
self.stockNumber = ko.observable().extend({ required: true });
self.vinNumber = ko.observable().extend({ required: true });
self.partNumber = ko.observable({
modelNumber: self.modelNumber,
stockNumber: self.stockNumber
}).extend({ partNumberValid: true });
self.isPartNumberValid = ko.validatedObservable({
modelNumber: self.modelNumber,
stockNumber: self.stockNumber,
vinNumber: self.vinNumber,
partNumber: self.partNumber
});
self.message = ko.observable();
self.save = function() {
if (self.isPartNumberValid.isValid()) {
self.message("saved");
}
else {
debugger;
self.isPartNumberValid.errors.showAllMessages();
self.message("not saved");
}
};
}
ko.applyBindings(new VM());