敲除验证:如何在按钮单击时验证字段,而不是在输入更改时验证

Knockout Validation: how to validate the fields on button click, not on input change

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

我想在单击 "Submit" 按钮时验证我的字段,而不是每次更改输入值时。我该怎么做?

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);

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>

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

嗯,是的,当可观察值发生变化时,验证器确实会被触发。但是......你可以用验证器的 onlyIf 选项来欺骗他们。 我做了一个 Fiddler sample 它是如何工作的。

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

基本上,示例将 onlyIf 条件添加到所有验证器,并且 validateNow 可观察到的,决定验证器何时应该评估..基本上如您所愿...在提交方法中.

self.validateNow = ko.observable(false);

onlyIf 在所有验证器上被评估:

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

并且 validateNow 仅在提交时设置

self.submit = function() {
self.validateNow(true);

...我还重新设置了一些数据绑定,因为您的示例只将红色框放在输入的周围。

我习惯用构造函数创建我的闭包..所以示例与你的不一样"architecure",但我想你会理解它