Wir haben eine Komponente, die eine dynamisch aufgebaute Form hat. Der Code zum Hinzufügen eines Steuerelements mit Validatoren könnte folgendermaßen aussehen:
var c = new FormControl('', Validators.required);
Angenommen, ich möchte später den 2. Validator hinzufügen . Wie können wir das erreichen? Wir können online keine Dokumentation dazu finden. Ich habe jedoch festgestellt, dass es in den Formularsteuerelementen setValidators gibt
this.form.controls["firstName"].setValidators
Es ist jedoch nicht klar, wie ein neuer oder benutzerdefinierter Validator hinzugefügt werden soll.
quelle
.updateValueAndValidity()
die Formularsteuerung aufrufen , nachdem ich die neuen Validatoren eingestellt hatte.Hinzufügen zu dem, was @Delosdos gepostet hat.
Legen Sie einen Validator für ein Steuerelement fest in
FormGroup
:this.myForm.controls['controlName'].setValidators([Validators.required])
Entfernen Sie den Validator aus dem Steuerelement in der FormGroup:
this.myForm.controls['controlName'].clearValidators()
Aktualisieren Sie die FormGroup, sobald Sie eine der oben genannten Zeilen ausgeführt haben.
this.myForm.controls['controlName'].updateValueAndValidity()
Dies ist eine erstaunliche Möglichkeit, Ihre Formularvalidierung programmgesteuert festzulegen.
quelle
updateValueAndValidity
Methode erzählt haben , könnte eines Tages nützlich sein!updateValueAndValidity
wird weiterhin zur Durchführung der Validierung verwendet und in neueren Versionen von Angular nicht anders behandelt. Was passiert, ist,setValidators
die Validatoren zu aktualisieren, aber keine ValidierungsprüfungupdateValueAndValidity
durchzuführen , und dann verwenden Sie , um die Validierung durchzuführen. Sie müssen die Validatoren an einem Punkt einstellen, an dem die Änderungserkennung dies für Sie erledigt. Die VerwendungupdateValueAndValidity
in der Gruppe oder im Steuerelement hängt jedoch davon ab, welchen Validator Sie gerade als entscheidend festgelegt haben - github.com/angular/angular/issues/19622#issuecomment- 341547884 .updateValueAndValidity
. Danke @shammelburg!updateValueAndValidity()
, aber in einigen Fällen nicht. Wenn SieupdateValueAndValidity()
nach hinzugefügt haben,setValidators()
wirkt sich dies sofort auf die Änderungen in Bezug auf die Steuerung aus . Es ist also besser, updateValueAndValidity () `hinzuzufügen.Wenn Sie reactiveFormModule verwenden und formGroup wie folgt definiert haben:
Dann können Sie FormControl mit diesem Ansatz einen neuen Validator hinzufügen ( und alte behalten ):
FormControl.validator gibt einen Compose-Validator zurück, der alle zuvor definierten Validatoren enthält.
quelle
control.setValidators(control.validator ? [ control.validator, Validators.email ] : Validators.email);
, um strenge Nullprüfungen zu umgehenIch denke, die ausgewählte Antwort ist nicht korrekt, da die ursprüngliche Frage lautet "Hinzufügen eines neuen Validators nach dem Erstellen des formControl".
Soweit ich weiß, ist das nicht möglich. Das einzige, was Sie tun können, ist, das Array der Validatoren dynamisch zu erstellen.
Was wir jedoch vermissen, ist eine Funktion addValidator (), um die bereits zum formControl hinzugefügten Validatoren nicht zu überschreiben. Wenn jemand eine Antwort auf diese Anforderung hat, wäre es schön, hier gepostet zu werden.
quelle
control.setValidators(control.validator ? [ control.validator, Validators.email ] : Validators.email);
würde funktionieren.Zusätzlich zur Antwort von Eduard Void gibt es hier die
addValidators
Methode:Mit ihm können Sie Validatoren dynamisch einstellen:
quelle