【问题标题】:Inject custom service into a custom Validator将自定义服务注入自定义验证器
【发布时间】:2017-07-27 13:14:12
【问题描述】:

我正在尝试制作自定义 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)

我做错了什么?

谢谢

【问题讨论】:

    标签: forms validation angular custom-validators


    【解决方案1】:
    @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)]
      });
    }
    

    【讨论】:

    • 谢谢!你拯救了我的一天。我不知道如何使用自定义服务以这种方式进入formBuilder.group
    • 对不起,还有一个问题。在EmailValidator 上如果邮件存在,会返回什么?我的意思是return this.api.CheckUser(control.value).then(response =&gt; { if(response.msg === "Exist") { response; } else { null; } }); } 在这两种情况下验证都是成功的,如果用户存在会返回什么?
    • 例如return { error: 'User exists'}; 或任何其他您想在出现错误时获得的信息。
    • 很好的解决方案,尤其是绑定验证器。
    • @GünterZöchbauer 如果ReactiveFormsModule 提供了一种在FormControl 上查询验证器的方法,并提供了一种确定哪个特定AsyncValidatorsPENDING 的方法,那就太好了,但是没有,所以我们最终会遇到验证者有状态的情况。 ?
    猜你喜欢
    • 2016-09-02
    • 2016-05-16
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2013-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多