2016-08-11 37 views
5

工作,我試圖創建一個自定義的異步驗證,即進入到服務器並檢查是否電子郵件已經被註冊。的Http不角2定製的異步確認

不幸的是,它似乎是GET請求從來沒有發射,因爲什麼都不會發生。我已經嘗試了subscribe內的多個console.log,但它們沒有運行。

如果該請求工作驗證之外我檢查了,和它,所以這不是問題。

import { Component } from '@angular/core'; 
import { FormGroup, FormBuilder, Validators, FormControl } from '@angular/forms'; 
import { Response, Http } from '@angular/http'; 

@Component({ 
    templateUrl: 'build/pages/welcome/signup/signup.html', 
    providers: [AuthService, CustomValidators] 
}) 
export class Signup { 

    signupForm: FormGroup; 

    constructor(private formBuilder: FormBuilder, private http: Http) { 

     this.signupForm = formBuilder.group({ 
      'email': ['', Validators.required, this.checkEmail], 
     }): 
    } 

    checkEmail(control: FormControl): Promise<any> { 

      const promise = new Promise<any>(
      (resolve, reject) => { 

       this.http.get('/sharealead/main.php?action=checkEmail').subscribe(
        (res: Response) => { 
         console.log('it never gets here'); 
         console.log(res) 
         if (res.text() == 'already there') { 
          resolve({'emailTaken': true}); 
         } else { 
          resolve(null); 
         } 
        }, 
        (err) => { 
         console.log('it never gets here'); 
         console.log(err); 
        } 
       ) 
      } 
     ); 
     return promise; 
    } 

} 

回答

8

這是因爲您引用了該函數並且您丟失了this上下文。您可以使用bind方法或包裝箭頭的功能來修復(鏈接功能的組件實例):

this.signupForm = formBuilder.group({ 
     'email': ['', Validators.required, this.checkEmail.bind(this) ], 
}); 

this.signupForm = formBuilder.group({ 
     'email': ['', Validators.required, (control:Control) => { 
      return this.checkEmail(control); 
     } ], 
}); 

在你的情況,this不包含http財產...

+0

事實上,愚蠢的錯誤,看起來像我需要這個關鍵字在JavaScript(如接受了約8分鐘,當計算器讓我我還是選你的答案) –

+0

歡迎你多一個教訓!是的,在JavaScript中使用'this'關鍵字是有點特定的...... –

+0

你能否也請指導如何使這種驗證器觸發器僅適用於場模糊。就我而言,即使在文本框中輸入電子郵件時,它也會發送http請求。所以,我輸入完我的電子郵件地址之前,它已經派出多個請求,服務器 –