JSFiddle - React, Tailwind, and code Playground
by xristo91
HTML
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout-validation/2.0.2/knockout.validation.min.js"></script>
<fieldset>
<div class="row" data-bind="validationElement: firstName">
<label>First name:</label>
<input type="text" data-bind="textInput: firstName"/>
</div>
<div class="row" data-bind="validationElement: lastName">
<label>Last name:</label>
<input data-bind="value: lastName"/>
</div>
<div class="row">
<div class="row">
<label>Age:</label>
<input data-bind="value: age" required="required"/>
</div>
</div>
</fieldset>
<fieldset>
<button type="button" data-bind='click: submit'>Submit</button>
</fieldset>
CSS
.wrong-field input {
border:1px solid red;
}
/*-----------------------------------------------------------------*/
@import url(https://fonts.googleapis.com/css?family=Open+Sans:700,400);
body {padding: 10px 0;font-family: 'Open Sans', sans-serif;font-weight: 400;font-size: 14px;}
fieldset {padding: 10px;}
strong {font-weight: 700;}
label {display:inline-block;width: 120px;}
button {padding: 3px 6px;}
input, select {width: 180px; padding: 3px 6px; border-radius: 3px;border: 1px solid #ccc;outline: none;margin-right: 5px;transition: .3s all ease-in-out;}
select {width:194px;}
input:focus {border: 1px solid #5579A9;box-shadow: 0px 0px 4px 0px #6FA5ED;}
.row {margin-bottom: 5px;}
.well {border:1px solid #ccc;border-radius: 3px;background-color:#efefef;box-sizing:border-box; width:100%;padding:10px;}
JavaScript
ko.validation.init({
insertMessages:false,
messagesOnModified:false,
decorateElement: true,
errorElementClass: 'wrong-field'
}, true);
var viewModel = {
firstName: ko.observable().extend({minLength: 2, maxLength: 10}),
lastName: ko.observable().extend({required: true}),
age: ko.observable().extend({min: 1, max: 100}),
submit: function() {
if (viewModel.errors().length === 0) {
alert('Thank you.');
}
else {
alert('Please check your submission.');
viewModel.errors.showAllMessages();
}
},
};
viewModel.errors = ko.validation.group(viewModel);
ko.applyBindings(viewModel);