2017-12-05 12 views
2

カスタムバリデーター機能を実装して、電話番号(自宅電話と携帯電話)のいずれかを入力しようとしています。私は両方のフィールドにエラーメッセージを表示し、両方がタッチされ、有効な値を持たない場合、何らかの理由で私のコードが予期したとおりに動作しません。この作品で私を助けてください。 - ありがとう! ここstackblitzリンクhttps://stackblitz.com/edit/angular-ve5ctu2つのフィールドのどちらかが必要な場合に角2のカスタムバリデーターが必要です。

createFormGroup() { 
    this.myForm = this.fb.group({ 
    mobile : new FormControl('', [this.atLeastOnePhoneRequired]), 
    homePhone : new FormControl('', [this.atLeastOnePhoneRequired]) 
    }); 
} 

atLeastOnePhoneRequired(control : AbstractControl) : {[s:string ]: boolean} { 
    const group = control.parent; 
    if (group) { 
    if(group.controls['mobile'].value || group.controls['homePhone'].value) { 
     return; 
    } 
    } 
    let errorObj = {'error': false}; 
    return errorObj; 
} 
+0

https://stackoverflow.com/questions/31788681/angular2-validator-which-relies-on-multiple-フォームフィールド – Eliseo

答えて

1

代わりの各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

+0

制御の仕方ここで無効ですか?このフォームに他のフィールドがある場合、フォームが無効な場合、フォームはすべて赤色になります(controlTouched &&(controlInvalid || parentInvalid))例:[StackBlitz](https://stackblitz.com/edit/angular-kcqyse- cfkkur)。 @ AJT_82とても感謝しています。 – user3595026

+0

フォームコントロールに 'errorStateMatcher'を設定しないでください。上で述べたように、フォームグループにエラーが設定されている場合は必要です。フォームコントロールは必要ありません:) – Alex

+0

私のコメントは次のとおりです: 'バリデーターがフォームグループではなくフォームコントロールに設定されている場合のみ、マットエラーが表示されます。 ' – Alex

関連する問題