I was looking for an easy way to implement a validation based on the result of an AJAX request without making it synchronous. I noticed that Knockout JS Validation wraps it’s calls to validation functions in a computed observable. This means our validation result will be dynamically re-evaluated if we base it on another observable.
The trick is to create an observable into which we feed the result of the HTTP call-back, and use that in the validation function. Here’s a code snippet using JQuery too, it assumes there’s a service that checks that the field value is unique and returns true or false.
var viewModel = { myField: ko.observable(null), isMyFieldUnique: ko.observable(true) }; viewModel.myField.subscribe(function () { $.getJSON( 'myservice?myField=' + escape(viewModel.myField(), function (result) { viewModel.isMyFieldUnique(result); } ); }); viewModel.myField.extend({ validation: { validator: function (val, param) { return viewModel.isMyFieldUnique(); }, message: "myField is not unique." } });