Angularで、コントロールの作成後にValidatorをFormControlに追加するにはどうすればよいですか?


89

動的に構築されたフォームを持つコンポーネントがあります。バリデーターを使用してコントロールを追加するコードは、次のようになります。

var c = new FormControl('', Validators.required);

しかし、後で2番目のバリデーターを追加したいとします。どうすればこれを達成できますか?このオンラインに関するドキュメントは見つかりません。フォームコントロールにはsetValidatorsがありますが

this.form.controls["firstName"].setValidators 

しかし、新しいバリデーターまたはカスタムバリデーターを追加する方法は明確ではありません。

回答:


118

FormControlにバリデーターの配列を渡すだけです。

次に、既存のFormControlにバリデーターを追加する方法を示す例を示します。

this.form.controls["firstName"].setValidators([Validators.minLength(1), Validators.maxLength(30)]);

これにより、FormControlの作成時に追加した既存のバリデーターがリセットされることに注意してください。


5
ハ...時々あなたは何かをとても長く見ているので、ただ立ち去るのが最善です。ありがとうございました!!
melegant 2016

1
検証を削除する方法はありますか
Abhijith ss 2017

7
古いものをオーバーライドせずにこれを行う方法はありますか?または新しいものを追加する方法はありますか?
danday 7418年

1
@ danday74、この質問の下部にあるEduardVoidの回答を確認してください。受け入れられるべき答えimo。彼はあなたが知る必要があることをする方法を説明します、そしてそれは私もする方法を知る必要がありました。
クリス

8
.updateValueAndValidity()新しいバリデーターを設定した後、フォームコントロールも呼び出す必要がありました。
キーレオン

91

@Delosdosが投稿したものに追加します。

FormGroup:でコントロールのバリデーターを設定します。 this.myForm.controls['controlName'].setValidators([Validators.required])

FormGroupのコントロールからバリデーターを削除します。 this.myForm.controls['controlName'].clearValidators()

上記のいずれかの行を実行したら、FormGroupを更新します。 this.myForm.controls['controlName'].updateValueAndValidity()

これは、フォームの検証をプログラムで設定するためのすばらしい方法です。


2
私にとっては、最後の行がなくても機能しました。Angularの新しいバージョンでは、フォームの有効性が自動的に更新されると確信しています。しかし、updateValueAndValidity方法について教えてくれてありがとう、いつか役に立つかもしれません!
Nino Filiu 2018

@NinoFiliuupdateValueAndValidityは引き続き検証を実行するために使用され、Angularの新しいバージョンでは同じように処理されます。何が起こるかはsetValidators、バリデーターを更新しますが、検証チェックを実行せず、次にを使用updateValueAndValidityして検証を実行します。変更検出が処理するポイントでバリデーターを設定する必要がありますが、updateValueAndValidity重要に設定したバリデーターに応じて、グループまたはコントロールで使用することができます-github.com/angular/angular/issues/19622#issuecomment- 341547884
mtpultz 2018

4
私はAngular6を使用していて、がないと動作させることができませんでしたupdateValueAndValidity。ありがとう@shammelburg!
Oli Crt 2018

1
Angular 7では、最後の更新行がないと機能しません。
DavidFindlay19年

はい。なしupdateValueAndValidity()で動作しますが、場合によっては動作しません。updateValueAndValidity()setValidators()に追加した場合は、コントロールに関連する変更にすぐに影響します。したがって、updateValueAndValidity() `を追加することをお勧めします。
JamithNImantha20年

78

reactFormModuleを使用していて、formGroupが次のように定義されている場合:

public exampleForm = new FormGroup({
        name: new FormControl('Test name', [Validators.required, Validators.minLength(3)]),
        email: new FormControl('test@example.com', [Validators.required, Validators.maxLength(50)]),
        age: new FormControl(45, [Validators.min(18), Validators.max(65)])
});

このアプローチでFormControlに新しいバリデーターを追加する(そして古いバリデーターを保持する)ことができるよりも:

this.exampleForm.get('age').setValidators([
        Validators.pattern('^[0-9]*$'),
        this.exampleForm.get('age').validator
]);
this.exampleForm.get('email').setValidators([
        Validators.email,
        this.exampleForm.get('email').validator
]);

FormControl.validatorは、以前に定義されたすべてのバリデーターを含む構成バリデーターを返します。


13
Imoこれは受け入れられた答えでなければなりません。要求されたOPのようなバリデーターを追加する方法を示しますが、以前に設定されたバリデーターを保持する方法も示します。これは、受け入れられた回答を読んだ後、最初にグーグルで行った方法でした。すでに持っているバリデーターを上書きしたくなかったのですが、プログラムでバリデーターを追加する必要があったからです。この回答をありがとう@EduardVoid
Chris

3
私は前任者に同意します。問題は、フォームを置き換える方法ではなく、フォームを制御するため新しいバリデーターを追加する方法でした。
Plusce 2018

6
私はcontrol.setValidators(control.validator ? [ control.validator, Validators.email ] : Validators.email);厳密なヌルチェックを回避するために行いました
WilliamLohan19年

3

元の質問は「formControlの作成後に新しいバリデーターを追加する方法」であるため、選択した回答は正しくないと思います。

私の知る限り、それは不可能です。あなたができる唯一のことは、バリデーターの配列を動的に作成することです。

しかし、私たちが見逃しているのは、formControlにすでに追加されているバリデーターをオーバーライドしない関数addValidator()があることです。誰かがその要件に対する答えを持っているなら、ここに投稿されるといいでしょう。


1
あなたはうまくいくと思うcontrol.setValidators(control.validator ? [ control.validator, Validators.email ] : Validators.email);でしょう。
ウィリアムローハン


3

Eduard Voidの回答に加えて、次のaddValidators方法があります。

declare module '@angular/forms' {
  interface FormControl {
    addValidators(validators: ValidatorFn[]): void;
  }
}

FormControl.prototype.addValidators = function(this: FormControl, validators: ValidatorFn[]) {
  if (!validators || !validators.length) {
    return;
  }

  this.clearValidators();
  this.setValidators( this.validator ? [ this.validator, ...validators ] : validators );
};

これを使用して、バリデーターを動的に設定できます。

some_form_control.addValidators([ first_validator, second_validator ]);
some_form_control.addValidators([ third_validator ]);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.