i've been reading many questions ask how call knockout validation extender on button click event. answers come close answering question, involve workarounds using knockout-validate library. i'm not using knockout-validate library. want validate input field on button click event using validation rules defined in knockout extender.
for simplicity i'm going use required extender knockout documentation , apply simple use case. use case takes input , on button click event value user entered. or updates view show validation message if no value entered.
knockout code:
ko.extenders.required = function (target, overridemessage) { target.haserror = ko.observable(); target.validationmessage = ko.observable(); function validate(value) { target.haserror(value ? false : true); target.validationmessage(value ? "" : overridemessage || 'value required'); } return target; }; function myviewmodel() { self = this; self.userinput = ko.observable().extend({ required: 'please enter value' }); /** * event handler button click event */ self.processinput = function () { //validate input field //how call validate function in required extender? //if passes validation, input value dosomething(self.userinput()); }; }
markup:
<input type="text" data-bind="value: userinput, valueupdate: 'afterkeydown'" /> <span data-bind="visible: userinput .haserror, text: userinput .validationmessage" class="text-red"></span> <button data-bind="click: processinput ">do something</button>
how can trigger validation on button click event , show validation message if doesn't pass validation?
i believe looking @ example here - http://knockoutjs.com/documentation/extenders.html
you can not call validate directly, subscribe watches value , runs validate function on change , updates observable can check - haserror.
ko.extenders.required = function (target, overridemessage) { target.haserror = ko.observable(); target.validationmessage = ko.observable(); function validate(value) { target.haserror(value ? false : true); target.validationmessage(value ? "" : overridemessage || 'value required'); } //initial validation validate(target()); //validate whenever value changes target.subscribe(validate); //return original observable return target; }; function myviewmodel() { self = this; self.userinput = ko.observable().extend({ required: 'please enter value' }); /** * event handler button click event */ self.processinput = function () { if(self.userinput.haserror()){ console.log('has error'); }else{ console.log('no error'); } }; } // activates knockout.js ko.applybindings(new myviewmodel());
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> <input type="text" data-bind="value: userinput, valueupdate: 'afterkeydown'" /> <span data-bind="visible: userinput .haserror, text: userinput .validationmessage" class="text-red"></span> <button data-bind="click: processinput ">do something</button>
Comments
Post a Comment