2016-03-18 7 views
6

ich die folgende Ko-Validierung Plugin bin mit: https://github.com/Knockout-Contrib/Knockout-ValidationKnockout Validierung: wie die Felder auf die Schaltfläche klicken, um zu validieren, nicht auf Eingabeänderung

Ich möchte, dass meine Felder validieren, wenn ich auf die Schaltfläche „Senden“, nicht jedes Mal, wenn ich den Wert des Inputs ändere. Wie kann ich das machen?

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> 

Das ist mein jsfiddle: http://jsfiddle.net/xristo91/KHFn8/6464/

+2

Ihre jsfiddle wie angegeben zu funktionieren scheint undertsand wird - ich glaube, Sie nur vermisse einige 'required: true' – Carsten

+0

Leider ist das nicht genug :(Ich möchte meine Validierungen machen und die Fehlerklasse bei submit click, nicht bei live change. –

+0

na dann verschiebe einfach die Logik in den Click-Handler- funktionieren und tun es manuell – Carsten

Antwort

9

Nun, ja die Validierer tun gefeuert werden, wenn die beobachtbaren Veränderungen. Aber ... Sie können sie mit der Option onlyIf der Validatoren austricksen. Ich habe eine Fiddler sample gemacht, wie es funktionieren könnte.

Die Frage ist hier mehr ... was wollen Sie der Benutzer geklickt hat nach dem ersten Mal tun ....

Grundsätzlich ist die Probe stellt eine onlyIf Bedingung für alle Validatoren und die validateNow beobachtbaren , entscheidet, wann die Validatoren ... basically wie gewünscht ... in der submit-Methode auswerten sollten.

self.validateNow = ko.observable(false); 

die onlyIf auf allen Validator ausgewertet wird:

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

und die validateNow wird nur auf die eingestellte

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

... übermittle ich rearenged auch ein wenig die Daten-Bindungen , weil Ihre Probe nur die rote Box an den Eingängen anlegt.

Ich bin es gewohnt, meine Verschlüsse mit erstellen constructors..so die Probe ist wie bei Ihnen nicht die gleiche „architecure“, aber ich denke, Sie es

+0

Danke! Das ist eine gute Lösung meines Problems. –

Verwandte Themen