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?
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