Есть ли способ продлить валидацию в 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());
Другие вопросы по тегам