2017-03-07 41 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