淘汰验证:如何验证按钮点击时的字段,而不是输入更改

Hri*_*mov 8 javascript validation knockout.js knockout-validation

我正在使用以下敲除验证插件:https://github.com/Knockout-Contrib/Knockout-Validation

当我点击"提交"按钮时,我想验证我的字段,而不是每当我更改输入的值时.我怎样才能做到这一点?

使用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);
Run Code Online (Sandbox Code Playgroud)

HTML:

<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>
    &nbsp;
</fieldset>
Run Code Online (Sandbox Code Playgroud)

这是我的jsfiddle:http://jsfiddle.net/xristo91/KHFn8/6464/

Cod*_*ker 17

好吧,是的,当观察者改变时,验证者会被解雇.但是......你可以使用验证器的onlyIf选项来欺骗你.我做了一个Fiddler样本,它是如何工作的.

这里的问题更多......用户第一次点击后你想做什么....

基本上,该示例将onlyIf条件赋予所有验证器,并且validateNow可观察,决定验证器何时应该在提交方法中根据需要进行评估.

self.validateNow = ko.observable(false);
Run Code Online (Sandbox Code Playgroud)

在所有验证器上评估onlyIf:

self.firstName = ko.observable().extend({
minLength: {
  message:"minlength",
  params: 2,
  onlyIf: function() {
    return self.validateNow();
  }
},
Run Code Online (Sandbox Code Playgroud)

并且仅在提交时设置validateNow

self.submit = function() {
self.validateNow(true);
Run Code Online (Sandbox Code Playgroud)

...我还重新调整了一些数据绑定,因为你的样本只会在输入上放置红色框.

我习惯用构造函数创建我的闭包.所以样本与你的"architecure"不一样,但我认为你会遗忘它