Ist es möglich, einen Validator zu erstellen, der anhand mehrerer Werte entscheiden kann, ob mein Feld gültig ist?
Wenn die bevorzugte Kontaktmethode des Kunden beispielsweise per E-Mail ist, sollte das E-Mail-Feld erforderlich sein.
Vielen Dank.
Aktualisiert mit Beispielcode ...
import {Component, View} from 'angular2/angular2';
import {FormBuilder, Validators, formDirectives, ControlGroup} from 'angular2/forms';
@Component({
selector: 'customer-basic',
viewInjector: [FormBuilder]
})
@View({
templateUrl: 'app/components/customerBasic/customerBasic.html',
directives: [formDirectives]
})
export class CustomerBasic {
customerForm: ControlGroup;
constructor(builder: FormBuilder) {
this.customerForm = builder.group({
firstname: [''],
lastname: [''],
validateZip: ['yes'],
zipcode: ['', this.zipCodeValidator]
// I only want to validate using the function below if the validateZip control is set to 'yes'
});
}
zipCodeValidator(control) {
if (!control.value.match(/\d\d\d\d\d(-\d\d\d\d)?/)) {
return { invalidZipCode: true };
}
}
}
equal
undequalTo
Methoden und gute Dokumentation!Antworten:
Um die Methoden, die andere veröffentlicht haben, noch einmal zu wiederholen, habe ich auf diese Weise
FormGroup
Validatoren erstellt, an denen nicht mehrere Gruppen beteiligt sind.Geben Sie in diesem Beispiel einfach die Schlüsselnamen der Felder
password
und anconfirmPassword
.Um
Validators
Parameter zu übernehmen, müssen sie afunction
entweder mit aFormGroup
oderFormControl
als Parameter zurückgeben. In diesem Fall validiere ich aFormGroup
.Technisch hätte ich zwei beliebige Werte validieren können, wenn ich ihre Schlüssel gekannt hätte, aber ich bevorzuge es, meinen Namen
Validators
genauso zu benennen wie den Fehler, den sie zurückgeben werden. Die Funktion könnte geändert werden, um einen dritten Parameter zu verwenden, der den Schlüsselnamen des zurückgegebenen Fehlers darstellt.Aktualisiert am 6. Dezember 2016 (v2.2.4)
Vollständiges Beispiel: https://embed.plnkr.co/ukwCXm/
quelle
FormGroup
für die Validierung mehrerer Felder zu erstellen, anstattValidator
das Ganze zu aktivieren.[{validator: matchingPasswords('password', 'confirmPassword')},{validator: matchingEmail('email', 'confirmemail')}]
Ich habe es versucht, aber es funktioniert nicht. Irgendwelche Vorschläge ? @ DaveDaves Antwort war sehr, sehr hilfreich. Eine geringfügige Änderung kann jedoch einigen Personen helfen.
Falls Sie den
Control
Feldern Fehler hinzufügen müssen, können Sie die tatsächliche Konstruktion des Formulars und der Validatoren beibehalten:Anstatt einen Fehler für das
ControlGroup
Feld festzulegen, gehen Sie wie folgt für das tatsächliche Feld vor:quelle
passwordConfirmationInput.setErrors(passwordConfirmationInput.validator(passwordConfirmationInput))
in derelse
Verzweigung, um sie korrekt zu aktualisieren, wenn eine Änderung anpasswordInput
die Daten gültig macht.TypeError: passwordConfirmationInput.validator is not a function
. Dies liegt daran, dass ich das FormControl nicht explizit mit Validators.required erstellt habe. Ich habe die Validatoren leer gelassen und stattdessen das Attribut "erforderlich" für die Eingabe verwendet.{[key: string]: any}
, dersetErrors(...)
(nicht mehr?) Nicht zurückgibt. AuchsetErrors(...)
überschreibt alle Fehler , die bereits vorhanden sind, so dass ich auf die aktuelle Fehlerobjekt angehängt wie:let errors = formGroup.controls[passwordConfirmationKey].errors;
undif(!errors) errors={};
underrors['notEquivalent'] = true;
undformGroup.controls[dateControlFirst].setErrors(errors);
Wenn Sie Validatoren für mehrere Formularfelder implementieren, müssen Sie sicherstellen, dass Validatoren neu bewertet werden, wenn jedes Formularsteuerelement aktualisiert wird. Die meisten Beispiele bieten keine Lösung für ein solches Szenario, dies ist jedoch sehr wichtig für die Datenkonsistenz und das korrekte Verhalten.
Weitere Informationen finden Sie in meiner Implementierung eines benutzerdefinierten Validators für Angular 2, der dies berücksichtigt: https://gist.github.com/slavafomin/17ded0e723a7d3216fb3d8bf845c2f30 .
Ich verwende
otherControl.valueChanges.subscribe()
, um auf Änderungen in anderen SteuerelemententhisControl.updateValueAndValidity()
zu warten und eine weitere Validierungsrunde auszulösen, wenn andere Steuerelemente geändert werden.Ich kopiere einen Code unten, um später darauf zurückgreifen zu können:
match-other-validator.ts
Verwendung
So können Sie es mit reaktiven Formen verwenden:
Weitere aktuelle Validatoren finden Sie hier: moebius-mlm / ng-validatoren .
quelle
this
für? Eigentlich ist es gut, eine benannte Funktion für Debugging-Zwecke zu haben.othercontrol.valuechanges.subscribe
wurde nirgendwo abgemeldet.valueChanges
Observable beendet, wenn dasotherControl
zerstört wird, was dazu führt, dass das Abonnement ebenfalls beendet wird. Ihre Bedenken könnten jedoch berechtigt sein. Ich würde vorschlagen, diesen Code mit der neuesten Version von Angular unter Verwendung verschiedener Testfälle gründlich zu debuggen. Bitte melden Sie sich zurück, wenn Sie Probleme finden.Ich verwende Angular 2 RC.5, konnte aber die ControlGroup aufgrund der hilfreichen Antwort von Dave nicht finden. Ich fand, dass FormGroup stattdessen funktioniert. Also habe ich ein paar kleinere Updates für Daves Codes gemacht und dachte, ich würde sie mit anderen teilen.
Fügen Sie in Ihrer Komponentendatei einen Import für FormGroup hinzu:
Definieren Sie Ihre Eingaben, falls Sie direkt auf das Formularsteuerelement zugreifen müssen:
Instanziieren Sie in Ihrem Konstruktor Ihr Formular:
Fügen Sie die MatchingPasswords-Funktion in Ihre Klasse ein:
Hoffe, dies hilft denen, die RC.5 verwenden. Beachten Sie, dass ich noch nicht auf RC.6 getestet habe.
quelle
if (passwordInput.value !== passwordConfirmationInput.value) { return passwordConfirmationInput.setErrors({ notEquivalent: true }); } else { return passwordConfirmationInput.setErrors(null); }
Viel Graben in eckigen Quellen, aber ich habe einen besseren Weg gefunden.
HTML-Teil für Passwortgruppe
quelle
Die Antwort von matthewdaniel erweitern, da sie nicht genau richtig ist. Hier ist ein Beispielcode, der zeigt, wie ein Validator einem richtig zugewiesen wird
ControlGroup
.Hier ist ein funktionierendes Beispiel: http://plnkr.co/edit/Zcbg2T3tOxYmhxs7vaAm?p=preview
quelle
ControlGroup
wird zugunsten einesFormGroup
Betrachters entfernt. Docs and Learn Angular2 BeispielHier ist eine weitere Option, die ich mir ausgedacht habe und die nicht von einem Ganzen oder Sub abhängig
ControlGroup
ist, sondern direkt an jedes gebunden istControl
.Das Problem, das ich hatte, war, dass die Steuerelemente, die voneinander abhängig waren, nicht hierarchisch zusammen waren, sodass ich keine erstellen konnte
ControlGroup
. Außerdem wurde mein CSS so eingerichtet, dass jedes Steuerelement die vorhandenen Winkelklassen nutzt, um zu bestimmen, ob ein Fehlerstil angezeigt werden soll. Dies war komplizierter, wenn eine Gruppenvalidierung anstelle einer steuerungsspezifischen Validierung durchgeführt wurde. Der Versuch festzustellen, ob eine einzelne Kontrolle gültig war, war nicht möglich, da die Validierung an die Gruppe von Kontrollen und nicht an jede einzelne Kontrolle gebunden war.In meinem Fall wollte ich, dass der Wert eines Auswahlfelds bestimmt, ob ein anderes Feld erforderlich ist oder nicht.
Dies wird mit dem Form Builder für die Komponente erstellt. Für das ausgewählte Modell habe ich es nicht direkt an den Wert des Anforderungsobjekts gebunden, sondern an Funktionen zum Abrufen / Festlegen gebunden, mit denen ich Ereignisse "bei Änderung" für das Steuerelement verarbeiten kann. Dann kann ich die Validierung für ein anderes Steuerelement manuell festlegen, abhängig vom neuen Wert der ausgewählten Steuerelemente.
Hier ist der relevante Ansichtsteil:
Der relevante Komponententeil:
In meinem Fall war immer eine Mustervalidierung an das Steuerelement gebunden, sodass das
validator
immer auf etwas gesetzt ist, aber ich denke, Sie können dasvalidator
auf null setzen, wenn Sie keine Validierung an das Steuerelement gebunden haben.UPDATE: Es gibt andere Methoden zum Erfassen der
(ngModelChange)=changeFunctionName($event)
Modelländerung, z. B. zum Abonnieren von Steuerwertänderungen mithilfe vonthis.form.controls["employee"].valueChanges.subscribe(data => ...))
quelle
Ich habe die meisten dieser Antworten ausprobiert, aber keine davon hat für mich funktioniert. Ich habe hier ein funktionierendes Beispiel gefunden: https://scotch.io/@ibrahimalsurkhi/match-password-validation-with-angular-2
quelle
equalTo
Ich habe auch danach gesucht und am Ende das ng2-Validierungspaket ( https://www.npmjs.com/package/ng2-validation ) verwendet.Hier ist ein Beispiel: Template Driven:
Modellgetrieben:
Vorlage:
quelle
Hier ist meine Version, die ich verwendet habe, um sicherzustellen, dass ein Alter in einem Feld größer oder gleich dem Alter in einem anderen Feld ist. Ich verwende auch Formulargruppen, daher verwende ich die
group.get
Funktion eher alsgroup.controls[]
Und in der Komponente:
quelle
Ich denke, Ihre beste Wette für den Moment ist es, eine Formulargruppe zu erstellen, die Ihre Steuerelemente enthält. Wenn Sie Ihren Control-Instanziieren, übergeben Sie die Funktion, um ihn zu validieren. Beispiel:
Ich weiß, dass dies stark von der Version von anglejs2 abhängt, die Sie ausführen. Dies wurde gegen 2.0.0-alpha.46 getestet
Wenn jemand einen besseren Vorschlag hat, z. B. einen benutzerdefinierten Validator zu schreiben (was möglicherweise der beste Weg ist), ist er willkommen.
BEARBEITEN
Sie können auch ControlGroup verwenden und diese Gruppe vollständig validieren.
Bearbeiten Sie einfach die Nachrichten entsprechend Ihrer Domain.
quelle
Die Antwort von Louis Cruz war für mich sehr hilfreich.
Zum Abschluss fügen Sie einfach das Zurücksetzen der setErrors hinzu: return passwordConfirmationInput.setErrors (null);
Und alles funktioniert gut!
Danke,
Grüße,
TGA
quelle
Winkel 8 Beispiel für die Validierung im Kennwortbestätigungsfeld
Zu Ihrer Information: Dadurch wird die Validierung im Feld passwordConfirm nicht aktualisiert, wenn das Hauptfeld "password" nach Ablauf dieser Validierung geändert wird. Sie können das Kennwortbestätigungsfeld jedoch ungültig machen, wenn ein Benutzer in das Kennwortfeld eingibt
register.component.ts
Passwort-Bestätigungs-Validator.ts
register.component.html
quelle
Ich würde vorschlagen, die Bibliothek zu benutzen
ng-form-rules
. Es ist eine großartige Bibliothek zum Erstellen aller Arten von Formularen mit von der Komponente entkoppelter Validierungslogik, die von Wertänderungen anderer Bereiche im Formular abhängen kann. Sie haben eine großartige Dokumentation , Beispiele und ein Video, das eine Reihe seiner Funktionen zeigt . Eine solche Validierung durchzuführen ist trivial.In der README-Datei finden Sie einige allgemeine Informationen und ein einfaches Beispiel.
quelle
Validierungsregeln für Angular 4-Kennwortübereinstimmungen.
Wenn Sie Fehlerkontrollfelder benötigen, können Sie dies tun.
Dann müssen Sie diese Methode in
constructor
Methode Like as deklarieren.Anstatt einen Fehler in der ControlGroup festzulegen, gehen Sie im eigentlichen Feld wie folgt vor:
HTML-Teil für Passwortgruppe
quelle