2014-04-03 2 views
5

Ich möchte ein paar Prüfungen für meine Formulare hinzufügen, deren Bedingung zu anderen Feldern Werte (dh ich habe ein Bereich Formular und from Feld muss weniger als to Feld sein, und umgekehrt). Ich habe bei den gegenwärtigen Validatoren nichts dergleichen gefunden, also habe ich versucht, diese selbst hinzuzufügen.Hinzufügen Parsley.js Validator mit referenziertem Feld

Also, habe ich diese beiden Funktionen zu Assert.prototype:

GreaterThanReference: function (reference) { 
    this.__class__ = 'GreaterThanReference'; 
    if ('undefined' === typeof reference) 
     throw new Error('GreaterThanReference must be instanciated with a value or a function'); 
    this.reference = reference; 
    this.validate = function (value) { 
     var reference = 'function' === typeof this.reference ? this.reference(value) : this.reference; 
     if ('' === value || isNaN(Number(value))) 
      throw new Violation(this, value, { value: Validator.errorCode.must_be_a_number }); 
     if (this.reference.value >= value) 
      throw new Violation(this, value); 
     return true; 
    }; 
    return this; 
} 

und

LessThanReference: function (reference) { 
    this.__class__ = 'LessThanReference'; 
    if ('undefined' === typeof reference) 
     throw new Error('LessThanReference must be instanciated with a value or a function'); 
    this.reference = reference; 
    this.validate = function (value) { 
     var reference = 'function' === typeof this.reference ? this.reference(value) : this.reference; 
     if ('' === value || isNaN(Number(value))) 
      throw new Violation(this, value, { value: Validator.errorCode.must_be_a_number }); 
     if (this.reference.value <= value) 
      throw new Violation(this, value); 
     return true; 
    }; 
    return this; 
} 

und diese beiden anderen ParsleyValidator.prototype.validators:

greaterthan: function (value) { 
    return $.extend(new Validator.Assert().GreaterThanReference(value), { 
     priority: 256, 
     requirementsTransformer: function() { 
     return { name : $(value).attr('alt'), value : +$(value).val() }; 
    }}); 
} 

und

Dann wollte ich die reversed Überprüfung für das referenzierte Feld hinzufügen, so dass, wenn ich nur den Wert des referenzierten Feldes ändere, ich das Formular noch validieren kann (im Bereich Beispiel, wenn ich vom Wert ändere, sollte ich validieren Feld. Und wenn ich zum Wert ändere, sollte ich vom Feld bestätigen). Um das zu erreichen, herausgegeben ich ParsleyField.prototype.addConstraint:

addConstraint: function (name, requirements, priority, isDomConstraint, isReference) { 
    name = name.toLowerCase(); 
    if ('function' === typeof window.ParsleyValidator.validators[name]) { 
     var constraint = new ConstraintFactory(this, name, requirements, priority, isDomConstraint); 
     // if constraint is a referenced one, I add the specular constraint on the referenced field 
     if((name == 'lessthan' || name == 'greaterthan') && isReference !== true) { 
      // I check if I already instanciated the referenced ParsleyField 
      var referencedField = $(requirements).data('Parsley') && $(requirements).data('Parsley').__class__ == 'ParsleyField' ? 
       $(requirements).data('Parsley') : 
       new ParsleyField($(requirements), this.parsleyInstance).init(); 
      referencedField.addConstraint(name == 'lessthan' ? 'greaterthan' : 'lessthan', '#' + this.$element.attr('id'), priority, isDomConstraint, true); 
     } 
     // if constraint already exist, delete it and push new version 
     if ('undefined' !== this.constraintsByName[constraint.name]) 
      this.removeConstraint(constraint.name); 
     this.constraints.push(constraint); 
     this.constraintsByName[constraint.name] = constraint; 
    } 
    return this; 
} 

Im Detail, habe ich das isReference Argument zu wissen, ob ich schon die umgekehrte Einschränkung für die Referenzierung Feld hinzugefügt hatte, um zirkuläre Referenzen zu vermeiden. Dann prüfe ich ziemlich schrecklich, ob die hinzugefügte Abhängigkeit eine Referenz hat und nicht bereits eine referenzierte Einschränkung ist (vielleicht kann sie verbessert werden, indem man eine Art "Constraint Type" hinzufügt, die indirekt sein kann oder referenziert werden kann)) für die Constraints, die andere Felder prüfen, und direkt für diejenigen, die nur den Wert überprüfen). Wenn diese Bedingung zutrifft, muss ich die neue Integritätsbedingung zu der bereits vorhandenen ParsleyField hinzufügen, oder, falls nicht instanziiert, zu einer neuen ParsleyField.

Diese Methode hat ein Problem. Wenn ich eine Einschränkung für ein Feld hinzufüge, das auf ein Feld verweist, das noch nicht instanziiert wurde, überschreibt es, wenn der normale Fluss von Parsley zu diesem Feld gelangt, es, wodurch die zuvor hinzugefügte Abhängigkeit aufgehoben wird.

Nullfrage: Ist das der richtige Weg, um das zu erreichen, was ich will? Ich gebe zu, dass ich die Parsley-API nicht zu sehr erforscht habe, aber ich möchte so wenig Funktionen wie möglich verwenden, da ich die gleiche Checks-Server-Seite verwende und ich in der Lage sein sollte, auf beiden Seiten die gleichen Dinge zu tun.

Wenn Null-Antwort ist "Ja", wie kann ich dieses Überschreiben Problem lösen? Wahrscheinlich sollte ich in der Lage sein, auf Instanziierung ParsleyField zu prüfen, ob es bereits instanziiert wurde, aber wie?

Antwort

1

Ich weiß nicht, welche Version von Petersilie js Sie verwenden, und vielleicht ist meine Antwort jetzt nicht aktuell. Das gleiche Problem hatte ich jedoch mit Version 2.0.2. Glücklicherweise enthalten die Dokumente ein Tutorial zum Schreiben von benutzerdefinierten Validatoren. Könnten Sie bitte überprüfen Sie die folgenden https://github.com/mvpotter/parsley-extra-validators. Wenn ich dich richtig verstehe, machen sie genau das, was du brauchst. Jede Rückmeldung wird geschätzt.

+0

Oh danke!^_^Als ich die Frage schrieb, gab es keine zusätzlichen Validatoren für Parsley 2.0, ich werde sie so schnell wie möglich überprüfen. – goffreder

Verwandte Themen