代わりの各formControlのバリデータをマーキングされ、電話番号のネストされたグループを作成し、そのグループにバリデータを適用します。このサンプルでは、バリデーターをフォーム全体に適用します。
また、バリデーターを適用する場合、フィールドが有効なときにnull
を返す必要があります。
また、角材を使用しているため、を表示するには、ErrorStateMatcher
を追加する必要があります。 mat-errors
は、バリデーターがフォームグループではなくフォームコントロールに設定されている場合にのみ表示されます。
あなたのコードは、以下のようになります
:
createFormGroup() {
this.myForm = this.fb.group({
mobile : new FormControl(''),
homePhone : new FormControl('')
// our custom validator
}, { validator: this.atLeastOnePhoneRequired});
}
atLeastOnePhoneRequired(group : FormGroup) : {[s:string ]: boolean} {
if (group) {
if(group.controls['mobile'].value || group.controls['homePhone'].value) {
return null;
}
}
return {'error': true};
}
をエラー状態マッチャ:
あなたがコンポーネントにマークし
export class MyErrorStateMatcher implements ErrorStateMatcher {
isErrorState(control: FormControl | null, form: FormGroupDirective | NgForm | null): boolean {
const controlTouched = !!(control && (control.dirty || control.touched));
const controlInvalid = !!(control && control.invalid);
const parentInvalid = !!(control && control.parent && control.parent.invalid && (control.parent.dirty || control.parent.touched));
return (controlTouched && (controlInvalid || parentInvalid));
}
}
:
matcher = new MyErrorStateMatcher();
し、それをマーク両方の入力フィールドでテンプレートに追加します。また、検証メッセージを表示するための*ngIf
がどのように見えるか注意してください。
<mat-form-field>
<input matInput placeholder="Mobile" formControlName="mobile" [errorStateMatcher]="matcher">
<mat-error *ngIf="myForm.hasError('error')">
"Enter either phone number"
</mat-error>
</mat-form-field>
<mat-form-field>
<input matInput placeholder="Home Phone" formControlName="homePhone" [errorStateMatcher]="matcher">
<mat-error *ngIf="myForm.hasError('error')">
"Enter either phone number"
</mat-error>
</mat-form-field>
StackBlitz
https://stackoverflow.com/questions/31788681/angular2-validator-which-relies-on-multiple-フォームフィールド – Eliseo