2017-03-07 38 views
4

我正在嘗試使用自定義的Angular 2表單Validator來檢查用戶是否存在於數據庫中。將自定義服務注入到自定義驗證程序中

這是我的自定義窗體Validator

import { FormControl } from '@angular/forms'; 
import {API} from "../services/api"; 
import {ReflectiveInjector} from "@angular/core"; 

export class EmailValidator { 

    constructor() {} 

    static checkEmail(control: FormControl,): any { 
    let injector = ReflectiveInjector.resolveAndCreate([API]); 
    let api = injector.get(API); 

    return api.checkUser(control.value).then(response => { 
     response; 
    }); 

    } 

} 

的代碼,這是這是我的定製服務,這是負責發出請求到節點API在後端

import { Injectable } from '@angular/core'; 
import { Http } from '@angular/http'; 
import 'rxjs/add/operator/toPromise'; 

@Injectable() 
export class API { 
    private backendUrl = 'http://127.0.0.1:5000/api/register/'; 

    constructor(private http: Http) { } 

    checkUser(email:string): Promise<any> { 
    return this.http.get(this.backendUrl + email) 
     .toPromise() 
     .then(response => response.json()) 
     .catch(this.handleError); 
    } 

當我嘗試驗證用戶,這是顯示的錯誤

EXCEPTION: Error in ./TextInput class TextInput - inline template:0:0 caused by: No provider for Http! (API -> Http) 

我做錯了什麼?

感謝

回答

5
@Injectable() 
export class EmailValidator { 

    constructor(private api:API) {} 

    /* static */ checkEmail(control: FormControl,): any { 
    return this.api.checkUser(control.value).then(response => { 
     response; 
    }); 
    } 
} 

將它添加到的@NgModule()@Component()這取決於你想要什麼範圍它有

providers: [EmailValidator] 

它注入到你想用它

export class MyComponent { 
    constructor(private emailValidator:EmailValidator, fb:FormBuilder){} 

    this myForm = fb.group({ 
    email: [], [this.emailValidator.checkEmail.bind(this.emailValidator)] 
    }); 
} 
組件
+0

謝謝!,你救了我的一天。我不知道如何使用這種方式的定製服務到'formBuilder.group' – Hanzo

+0

不客氣!很高興聽到這個爲你工作:) –

+0

對不起還有一個問題。在'EmailValidator'上如果郵件存在,將會返回什麼?我的意思是'返回this.api.CheckUser(control.value)。然後(響應=> { 如果(response.msg === 「存在」){ 響應; } 否則{ 空; } }); '在這兩種情況下,驗證都是成功的,如果用戶存在,會返回什麼? – Hanzo