4

Я новичок в использовании нокаута, и я пытаюсь использовать плагин проверки нокаута вместе с плагином отображения. У меня проблема с функцией isValid на объекте модели представления. Согласно документации isValid должен вернуть bool, чтобы определить, действительно ли какая-либо из наблюдаемых в модели представления, но когда я ее вызываю, я получаю сообщение об ошибке, что isValid не является функцией. Однако, если я назову isValid на самих наблюдаемых, он отлично работает. Проблема в том, что я использую плагин сопоставления с некоторыми динамическими объектами данных, которые я получаю с сервера, поэтому я не обязательно знаю имена наблюдаемых, которые мне нужны для проверки, поэтому нецелесообразно их проверять отдельно. Пример ниже упрощен, но в реальной реализации я не знаю имен наблюдаемых. Может, я просто пропустил документацию?Нокаут ViewModel isValid error при использовании плагина проверки нокаута

Спасибо за ваше время.

Это делает работу

var dataItem = { FirstName: '', LastName: '', Age: '', Email: '' } 


    var viewModel = function(data) { 

     var self = this; 
     this.Email = ko.observable().extend({ email: true }); 
     this.LastName = ko.observable().extend({ required: true }); 
     this.Age = ko.observable().extend({ required: true, min: 0 }); 
     this.saveClick = function() { 

      if (!self.Email.isValid() || !self.Age.isValid() || !self.LastName.isValid()) { 
       alert('Not valid'); 
      else { 

       alert('Valid'); 
      } 
     }; 
     this.cancelClick = function() { 

      ko.mapping.fromJS(dataItem, null, this); 
     } 

     ko.mapping.fromJS(data, {}, this); 
    }; 

    var viewModelInstance = new viewModel(dataItem); 
    ko.applyBindings(viewModelInstance, document.getElementById('bindingDiv')); 

Но это не работает

 var dataItem = { FirstName: '', LastName: '', Age: '', Email: '' } 


     var viewModel = function(data) { 

      var self = this; 
      this.Email = ko.observable().extend({ email: true }); 
      this.LastName = ko.observable().extend({ required: true }); 

      this.Age = ko.observable().extend({ required: true, min: 0 }); 
      this.saveClick = function() { 
       //TODO: according to the documentation you should be able to just 
       //check self.isValid() but that throws an error that there is no 
       //such method on the object? dunno why. 
       if (!self.isValid()) { 
        alert('Not Valid'); 
       } 
       else { 
        alert('Valid'); 
       } 
      }; 
      this.cancelClick = function() { 

       ko.mapping.fromJS(dataItem, null, this); 
      } 

      ko.mapping.fromJS(data, {}, this); 
     }; 

     var viewModelInstance = new viewModel(dataItem); 
     ko.applyBindings(viewModelInstance, document.getElementById('bindingDiv')); 

ответ

4

вызова ko.validation.group в вашей VM группы все подтверждаемые наблюдаемом на уровне VM. Тогда isValid будет истинным только в том случае, если у дочерних наблюдаемых ошибок нет.

Некоторые другие SO ответы о ko.validation.group

How to use ko.validation.group function

Knockout Validation ko.validation.group vs ko.validatedObservable

5

Просто думал, что я отправлю фактический код мне нужно использовать. Спасибо ragnarok56 за то, что указали мне в правильном направлении. Очевидно, я потратил слишком мало времени на документацию.

Я просто добавил эту строку кода выше, чем вызов, чтобы проверить IsValid() на модели представления

var result = ko.validation.group(viewModelInstance, { deep: true }); 
Смежные вопросы