reactive form
に2つのカスタムvalidator
があります。以下の関数を呼び出して、コンポーネントコンストラクターでフォームを作成します。
private createForm(): void {
this.passwordUpdateForm = this.formBuilder.group({
newpassword : [null, Validators.required],
passwordconfirm: [null, Validators.required]
},
{
validator: [PasswordValidation.PasswordMatch, PasswordValidation.PasswordRule] // validation method
});
}
PasswordValidationは、以下のような2つの関数を持つクラスです。
export class PasswordValidation {
public static PasswordMatch(control: AbstractControl) {
let password = control.get('newpassword'); // to get value in input tag
if(password){
let confirmPassword = control.get('passwordconfirm').value; // to get value in input tag
if (password.value !== confirmPassword) {
control.get('passwordconfirm').setErrors({ ['passwordmatch'] : true});
}else {
return null;
}
}
}
public static PasswordRule(control: AbstractControl) {
let password = control.get('newpassword').value; // to get value in input tag
let pattern = new RegExp('^(?=.*?[A-Z])(?=.*?[a-z])(?=.*?[0-9])(?=.*?[#?!@$%^&*-]).{8,64}');
if (!pattern.test(password)) {
control.get('newpassword').setErrors({ ['passwordrule'] : true});
}else if (password.toLowerCase() === 'something') {
control.get('newpassword').setErrors({ ['passwordrule'] : true});
}else {
return null;
}
}
}
各カスタムバリデーターは、このように個別に正常に機能します
validator: PasswordValidation.PasswordMatch
またはこれ
validator: PasswordValidation.PasswordRule
しかし、それらの両方を次のような配列で使用します
validator: [PasswordValidation.PasswordMatch, PasswordValidation.PasswordRule]
エラーthis.validator is not a function
が発生し、機能しません。わかりません。助けてください。
フォームグループ内の特定のユーザーコントロールで使用されるバリデーターの配列を受け入れるValidators.compose([])
を使用することをお勧めします。
たとえば、passwordconfirm
およびnewpassword
コントロールに対してバリデーターを追加する場合は、以下のように行うことができます。
private createForm(): void {
this.passwordUpdateForm = this.formBuilder.group({
newpassword : [null, Validators.compose([Validators.required,PasswordValidation.PasswordRule])],
passwordconfirm: [null, Validators.compose([Validators.required, PasswordValidation.PasswordMatch])]
});
ボンネットの下では、これはコードがどのように見えるかです
group(controlsConfig: {[key: string]: any}, extra: {[key: string]: any} = null): FormGroup {
const controls = this._reduceControls(controlsConfig);
const validator: ValidatorFn = isPresent(extra) ? extra['validator'] : null;
const asyncValidator: AsyncValidatorFn = isPresent(extra) ? extra['asyncValidator'] : null;
return new FormGroup(controls, validator, asyncValidator);
}
パラメータvalidator
は、実際には次のようなインターフェイスValidatorFn
の一種であることがわかります。
interface ValidatorFn {
(c: AbstractControl): ValidationErrors|null
}
したがって、上記のシグネチャを持つすべてのメソッドを受け入れることができることがわかります。
ソース: https://angular.io/api/forms/ValidatorFn
詳細については、このリンクを確認してください: https://toddmotto.com/reactive-formgroup-validation-angular-2