0

Я немного использовал Knockout и теперь попытаюсь использовать с ним отдельную библиотеку проверки. Моя ко-версия - 3.3.0, а проверка нокаута - 2.0.3, поэтому они должны быть обновлены. Я бегу этот простой пример с Chrome, что представлено в https://github.com/Knockout-Contrib/Knockout-Validation:Knockout.js и проверки нокаута не работают вместе

var myViewModel = ko.validatedObservable({ 
    property1: ko.observable().extend({ required: true }), 
    property2: ko.observable().extend({ max: 10 }) 
}); 

console.log(myViewModel.isValid()); //false 

myViewModel().property1('something'); 
myViewModel().property2(9); 

console.log(myViewModel.isValid()); //true 

Однако при запуске, что локально в Chrome это дает мне верно и для IsValid() - звонки, так что даже если это не требуется, и это пустая , это действительно. Однако некоторые из валидаций работают:

var myViewModel = ko.validatedObservable({ 
    property: ko.observable().extend({ min: 10 }) 
}); 
myViewModel.isValid() // true, should be false though I guess? 
myViewModel().property("test") 
myViewModel.isValid() // false 

Что может быть неправильным? Обе библиотеки очень популярны и являются самыми последними версиями, поэтому я не могу понять, почему примеры не работают.

ответ

1

В этом фрагменте кода вы можете увидеть, что Konockput 3,0 (3.3.0 уже не существует) и Ko.Validation 2.0.3 прекрасно работают вместе:

ko.validation.init({ 
 
    messagesOnModified: false, 
 
    insertMessages: true, 
 
}); 
 

 

 
// View model 1 
 

 
var myViewModel1 = ko.validatedObservable({ 
 
    property1: ko.observable('').extend({ required: true}), 
 
    property2: ko.observable().extend({ max: 10 }) 
 
}); 
 

 
console.log('Should be false: ', myViewModel1.isValid()); 
 
$('#messages').append('Should be false: ' + myViewModel1.isValid() + '\n'); 
 

 
myViewModel1().property1('something'); 
 
myViewModel1().property2(9); 
 

 
console.log('Should be true', myViewModel1.isValid()); 
 
$('#messages').append('Should be true: ' + myViewModel1.isValid() + '\n\n'); 
 

 
ko.applyBindings(myViewModel1, vm1); 
 

 

 
// View model 2 
 

 
var myViewModel2 = ko.validatedObservable({ 
 
    property: ko.observable().extend({ min: 10 }) 
 
}); 
 

 
myViewModel2().property(5); 
 
console.log('Should be false', myViewModel2.isValid()); 
 
$('#messages').append('Should be false: ' + myViewModel2.isValid() + '\n'); 
 

 
myViewModel2().property(50); 
 
console.log('Should be true', myViewModel2.isValid()); 
 
$('#messages').append('Should be true: ' + myViewModel2.isValid() + '\n\n'); 
 

 
ko.applyBindings(myViewModel2, vm2);
body, * { 
 
    font-family: 'Segoe UI', Verdana; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.3.0/knockout-min.js"></script> 
 

 
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.3/knockout.validation.js"></script> 
 
<h1>View Model 1</h1> 
 
<div id="vm1" name="vm1"> 
 
    Property 1: <input type="text" data-bind="value: property1"/> 
 
    <br/> 
 
    Property 2: <input type="text" data-bind="value: property2"/> 
 
    <br/> 
 
</div> 
 
<hr> 
 
<div id="vm2" name="vm2"> 
 
    Property: <input type="text" data-bind="value: property"/> 
 
</div> 
 
<pre id="messages"></pre>

validition Опция 'messagesOnModified: false', указанная в init, означает, что правила будут проверяться, когда модель привязана, а не когда наблюдаемый будет изменен в первый раз. Если параметр был прав, а исходное значение обязательного поля было пустым, сообщения об ошибках не отображались.

Если вы не указали значение для свойства на myViewModel2, то isValid было бы верно, но указав значение для него с myViewModel2().property(5) делает его ложным. Пустое поле не проверяется на минимальное значение.

1

min и max валидаторы игнорируют пустые поля. Если вам нравится

property: ko.observable(0).extend({ min: 10 }) 

затем

myViewModel.isValid() // false, as expected 
Смежные вопросы