2017-06-08 9 views
0

カスタムバリデータを使用して電子メールがデータベースに存在するかどうかを確認するにはどうすればよいですか?私はバリデーターに組み込まれていることを見つけようとしましたが、その目的のためのものはありません。 私は角度2を初めて使用しているため、カスタムバリデーターの使用方法がわからないため、質問するコードを置くことはできません。角2 - 電子メールの認証

コンポーネントでは、すべてのユーザーをデータベースから取得しています。入力フォームに入力済みの電子メールが既に存在するかどうかを確認する必要があります。

ngOnInit() { 
this.registrationService.getUsers().subscribe(data => this.allUsers = data, error => this.errorMsg = error); 

}サービスで

成分で
AddUser(regValues: any, allUsers: any) { 
    if (regValues.email !== "" || regValues.password !== "" || regValues.nickname !== "" || regValues.confirmpassword !== "") { 

     if (regValues.password != regValues.confirmpassword) { 
      window.alert("Password and confirm password don't match. Please input same password in these two fields."); 
     } 
     else if (regValues.password.length < 7) { 
      window.alert("Password must have minimum 7 characters. Please input password that has apropriate length."); 
     } 
     else if (regValues.username.length < 3) { 
      window.alert("Nickname must have minimum 3 characters. Please input nickname that has apropriate length."); 
     } 
     else { 

      if (allUsers.indexOf(regValues.email) !== -1) { 
       window.alert("This email is already taken. Please choose another one."); 
      } 

      var regUser = { 
       Email: regValues.email, 
       PasswordHash: undefined, 
       UserName: regValues.username 
      } 

      regUser.PasswordHash = Md5.hashStr(regValues.password); 

      let headers = new Headers({ 'Content-Type': 'application/json' }); 
      let options = new RequestOptions({ headers: headers }); 
      return this.http.post('/footballapi/user/add', regUser, options) 
       .map((response: Response) => response.json()) 
       .catch(this.registrationService.errorHandler); 
     } 
    } 
} 

Register(regValues: any) { let allUsers = this.registrationService.getUsers(); this.registrationService.AddUser(regValues, allUsers).subscribe(data => this.allUsers = data, error => this.errorMsg = error); }

HTMLフォーム:

<h4>Create a new account.</h4> 
 
<p>{{errorMsg}}</p> 
 
<hr /> 
 
<form #registrationForm="ngForm" (ngSubmit)="Register(registrationForm.value)"> 
 
    <div class="form-group"> 
 
     <label for="email">Email:</label> 
 
     <div class="col-md-10"> 
 
      <input type="text" name="email" ngModel required placeholder="Write your email address here..." /> 
 
     </div> 
 
    </div> 
 
    <div class="form-group"> 
 
     <label for="email">Nickname:</label> 
 
     <div class="col-md-10"> 
 
      <input type="text" name="nickname" ngModel required placeholder="Write your nickname here..." /> 
 
     </div> 
 
    </div> 
 
    <div class="form-group"> 
 
     <label for="password">Password:</label> 
 
     <div class="col-md-10"> 
 
      <input type="password" name="password" ngModel required placeholder="Write your password here..." /> 
 
     </div> 
 
    </div> 
 
    <div class="form-group"> 
 
     <label for="confirmpassword">Confirm password:</label> 
 
     <div class="col-md-10"> 
 
      <input type="password" name="confirmpassword" ngModel required placeholder="Write your password again..." /> 
 
     </div> 
 
    </div> 
 
    <div class="form-group"> 
 
     <div class="col-md-offset-2 col-md-10"> 
 
      <button type="submit" [disabled]="!registrationForm.form.valid">Confirm registration</button> 
 
     </div> 
 
    </div> 
 
</form>

+0

あなたのコードを共有しない限り、誰も助けることができません... – Alex

+0

あなたはそれよりも具体的にする必要があります。 Angularはクライアント側のフレームワークであり、データベースとは関係ありません。クライアントからデータベースに電子メールが存在するかどうかを確認するには、クライアントからサーバーAPIにHTTP要求を送信してから、データベースに要求を送信する必要があります。データベースはデータを返します。そこから、既存の電子メールがあるかどうかは、一致する電子メールが見つからなかった場合にデータベースから返されないため、データベースに存在するかどうかを判断できます。その後、サーバーはクライアントに応答を返すことができます。 – snaplemouton

+0

したがって、バックエンドで一致する電子メールを見つけて、結果を角度に送信する方が、角度のあるデータベースデータをシャッフルするよりも良いのですか? – user7479651

答えて

0

あなたは、バリデータ関数を記述し、データベースへの呼び出しを行うと、天気が電子メールが存在するかどうかと言って、変数を返す必要が非同期検証

を使用することによって、これを達成することができます。そして、これはブーリアンフラグは、モデル駆動型フォームを使用している場合aync validatorパラメータ として渡され、formbuilderを使用することになります返さ

import {Control} from "@angular/common" 
export class EmailValidators{ 
static checkEmail(control: Control){ 
    // make a db call{ 
// if exists 
return {checkEmail : true} 

}else return null; 

} 
} 

、あなたのコンポーネントでこれを含める

export calss AppComponent{ 
constructor(fb : FormBuilder){ 
this.form = fb.group({ 
email:['',Validators.EmailValidators.checkEmail] 
}) 
} 
} 

ここではEmailValidatorsであるクラスでありますu importとcheckEmailは、ブール値を返すカスタム検証を定義するために使用される静的メソッドです。

+0

HTTPプロトコルを扱えるデータベースを使用しているのでなければ、Webサーバーや別の処理手段を経由せずにデータベースに直接呼び出しを行うことはできませんHTTPリクエスト。 – snaplemouton

+0

返事をありがとう。最初に、パラメータ 'email'を持つバックエンドでメソッドを作成し、ブール値(たとえば)結果を角度に戻す必要があります。 trueの場合、バリデーターをtrueに設定します。 – user7479651

+0

@snaplemoutonはい、私はコントローラを使用してデータベースにアクセスできるWeb APIプロジェクトを使用しています。 Angularでは、私はコントローラにリクエストを送り、コントローラはデータベースに行き、角度に対するレスポンスを返します。 – user7479651

関連する問題