如何解决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]
});
如果我的代码可以(可以)更好,请告诉我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。