2017-12-23 7 views
1

私はAngular 5フォームを作成しています。私は私のフォーム(電子メールまたは電話)の連絡先情報の要件を持っています。メールアドレスまたは電話番号のいずれかが必要ですが、両方ではありません。このシナリオでカスタムバリデーターを作成するにはどうすればよいですか? docsから、バリデーターはただ1つのコントロールに責任があると思われますが、バリデーターはすべての値をチェックするために複数のコントロールを認識する必要があります。複数のフィールドを角度で妥当性検査するにはどうすればよいですか?

ngOnInit() { 
    this.form = this.formBuilder.group({ 
     'name': [null, [Validators.required]], 
     'email': [null, []], // A user can provide email OR phone, but 
     'phone': [null, []], // both are not required. How would you do this? 
    }); 
} 
+0

それぞれに同じカスタムバリデータを使用しますが、各コントロールへの参照を使用してどちらか一方を使用するとtrueを返します。良い例があります:https://stackoverflow.com/questions/43487413/password-and-confirm-password-field-validation-angular2-reactive-forms同じアイデアを使ってパスワードを検証します。それでも、2つのフォームコントロールをチェックしてグループバリデーターを作成します。 –

+0

まだ完全には動作していませんが、これを強化しようとしてください:https://stackblitz.com/edit/angular-9effym?file=app%2Fapp.component.ts – HDJEMAI

答えて

2

一つの可能​​な解決策は、例えば、引数としてフォーム自体を取る関数を宣言されています

export function emailAndPhone() { 
     return (form: FormGroup): {[key: string]: any} => { 
     return (form.value.phone && form.value.email) || 
       (!form.value.phone && !form.value.email) 
        ? { emailAndPhoneError : true } 
        : null; 
     }; 
    } 

validatorエキストラを使って、フォーム定義に検証関数を設定します。

ngOnInit() { 
    this.form = this.formBuilder.group({ 
     'name': [null, [Validators.required]], 
     'email': [null, []], // A user can provide email OR phone, but 
     'phone': [null, []], // both are not required. How would you do this? 
    }, { validator: emailAndPhone() }); 
} 

検証が無効な入力を検出したときに認識する必要がある場合は、emailAndPhoneErrorが定義されていることを確認してください。eフォームエラーリストにarlierがあります。このように

*ngIf="myForm.hasError('emailAndPhoneError')" //true means invalid 
+0

ここでemailAndPhoneErrorはどこから来ますか? – estus

+0

'{emailAndPhoneError:true}'は 'emailAndPhone()'関数の戻り値です。条件が無効な場合にのみ返されます。それ以外の場合はnullが返されます。 –

+0

フォーマットのためにこれを見落としました、ありがとう。 – estus

関連する問題