Angular Email Validator,如何实现更新?它可能的参数

问题描述

我已经应用了一个特定的电子邮件验证器,它在我创建用户时起作用,但是如果我尝试更新任何用户,电子邮件验证器会发送正在使用的消息电子邮件

换句话说,它在我创建时的行为,但是当我更新用户时,如果 id 和 email 相等,则需要允许用户

可以通过参数实现吗?

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { AbstractControl,AsyncValidator,FormControl,FormGroup,ValidationErrors,ValidatorFn } from '@angular/forms';
import { Observable,Subject } from 'rxjs';
import { map } from 'rxjs/operators';
import { url } from 'src/app/config/config';

@Injectable({
  providedIn: 'root'
})
export class EmailValidatorService implements AsyncValidator {

  constructor( private http: HttpClient ) { }

  validate( control: AbstractControl): Observable<ValidationErrors | null> {

    const email: string = control.value;
   
    return this.http.get<any[]>( url +'email?email=' + email )
                .pipe(
                  map( (resp: any) => {
                    
                    let respuesta = null;
                    if( resp == null ) {
                      respuesta = null;
                    } else {
                      if (resp.user == null ) {
                        respuesta = null;
                      } else {
                        if( (email.localeCompare(resp.user.email) == 0) ) {
                          respuesta = { email_in_use: true} ;
                        } else {
                          respuesta = null;
                        }
                     
                      }
                    }
                    return respuesta;
                  })
                );

  }

  
}

解决方法

import { HttpClient } from '@angular/common/http';
import { AbstractControl,AsyncValidatorFn,FormBuilder,FormControl,FormGroup,ValidationErrors,ValidatorFn } from '@angular/forms';
import { UserCreateComponent } from 'src/app/components/users/user-create/user-create.component';
import { url } from 'src/app/config/config';
import { Observable,Subject } from 'rxjs';
import { map } from 'rxjs/operators';
import { resolve } from 'url';
import { Injectable } from '@angular/core';


@Injectable({
  providedIn: 'root'
})

/**
 * Class for async validations communicating with the REST-API.
 */
export class MailValidator {
  static EmailUpdateValidator(UserCreateComponent: UserCreateComponent): AsyncValidatorFn {
    return (control: AbstractControl): Observable<ValidationErrors> => {

      let email = UserCreateComponent.gradientForm.get('email').value;
      if (email == null) {
        return null;
      }
      let id = UserCreateComponent.id;
      return UserCreateComponent.http.get<any[]>(url + 'usuarios/emailInUse?email=' + UserCreateComponent.gradientForm.get('email').value)
        .pipe(
          map((resp: any) => {

            let respuesta = null;
            if (resp == null) {
              return respuesta = null;
            } else {
              if (resp.user == null) {
                return respuesta = null;
              } else {
                if ((email.localeCompare(resp.user.email) == 0)) {
                  if (id == resp.user.id) {
                    return respuesta = null;
                  } else {
                    return respuesta = { email_in_use: true };
                  }

                } else {
                  return respuesta = null;
                }

              }
            }
            return respuesta;
          })
        )
    };
  }
}

我可以解决这个问题创建一个新的验证器 在组件中

this.gradientForm = this.fb.group({
    id: [value.id],name: [value.name,Validators.required],surname: [value.surname,email: [value.email,[Validators.required,Validators.email ],[MailValidator.EmailUpdateValidator(this)] ],user: [value.user,password: [value.password,Validators.required]
  });

如果我的代码可以(可以)更好,请告诉我。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...