2016-11-27 11 views
0

入力が有効な電子メール形式であるかどうかを確認するカスタムバリデータを作成しています。Angular2でカスタムバリデータを作成する方法

これは私のValidatorクラスです:

export class SignupComponent { 


    signupForm: FormGroup; 
    email: AbstractControl; 

    model: any = {}; 
    response: any; 


    constructor(fb: FormBuilder, private userService: UserService) { 
     this.signupForm = fb.group({ 
      'email' : ['', Validators.compose([Validators.required, EmailValidator.getEmailValidator()])] 

     }); 
     this.email = this.signupForm.controls['email']; 
    } 

そして最後に:HTMLに

<div class="form-group"> 

    <input class="form-control" 
      [(ngModel)]="model.email" 
      type="text" 
      id="name" 
      placeholder="Enter your email" 
      [formControl]="signupForm.controls['email']" 

    > 
    <div *ngIf="signupForm.controls['email'].errors?.required&& signupForm.controls['email'].touched" 
      class="alert alert-danger">Email is required</div> 
    <div *ngIf="signupForm.controls['email'].hasError('invalidChars') && signupForm.controls['email'].touched" 
      class="alert alert-danger">Please give a valid email address</div> 

マイコンポーネント:

import {FormControl} from "@angular/forms"; 

export class EmailValidator { 

    static getEmailValidator() { 
     return function emailValidator(control: FormControl): { [s: string]: boolean } { 

      if (!control.value.match(/^\[email protected][a-zA-Z_]+?\.[a-zA-Z]{2,3}$/)) { 
       return {invalidChars: true}; 
      } 
     } 
    } 
} 

私のHTMLは、そのように見えます例外私は得る:

Uncaught (in promise): Error: Error in ./SignupComponent class 
SignupComponent - inline template:31:4 caused by: Cannot read property 
'match' of undefined TypeError: Cannot read property 'match' of undefined at 
emailValidator 

私のマッチは未定義で、カスタムバリデーターを実装するにはどうすればよいでしょうか?

答えて

2

バリデーター自体が正常に見えるので、エラーはcontrol.valueが元のとおりundefinedであるように見えます。次へemailValidator機能を更新します。

static getEmailValidator() { 
    return function emailValidator(control: FormControl): { [s: string]: boolean } { 

     if (control.value && !control.value.match(/^\[email protected][a-zA-Z_]+?\.[a-zA-Z]{2,3}$/)) { 
      return {invalidChars: true}; 
     } 
    } 

だから、1は1が提供される場合にのみ正規表現をテスト値にしようとします。

+0

control.valueは未定義です。私はページをロードするときにその例外を取得します。 – GaborH

+0

また、フォームにコントロールをバインドする方法についても質問があります。 'form'(ここでは' div'要素)に '[formGroup] =" signupForm "'を付けて 'formControlName =" email "でなくてはいけませんか? バリデータに関しては、単純な特別なチェックではありません: 'if(control.value &&!control.value.match(/^\ w + @ [a-zA-Z _] +?\。[a-zA-Z ] {2,3} $ /)){'解決策ですか? –

+0

それは問題だった、私はそれについて考えなかった。私は(control.value &&!control.value.match(/^\ w + @ [a-zA-Z _] +?\。[a-zA-Z] {2,3} $ /))を追加しました。最初にそれが値を持っていれば、そして、当然のことながら、そのフィールドが手つかずである限り、値はありません。ソリューションで回答を編集した場合は、答えとして受け入れます。 – GaborH

関連する問題