Je crée une application dans Angular (4.0), qui contient un formulaire (FormGroup
). Dans ce formulaire, j'ai une entrée e-mail (avec FormControl
), et j'utilise Validators.email
pour validation.
import { Validators } from '@angular/forms';
// ...
let validators = [];
if ([condition]) {
validators.Push(Validators.email);
}
let fc = new FormControl([value] || '', validators);
// ...
Mais lorsque l'entrée est vide, elle n'est pas valide (elle a un ng-invalid
class), même si ce n'est pas obligatoire.
Est-ce un bon comportement? Que puis-je faire?
La solution de eric2783 est cependant assez bonne - si, à l'avenir, la sortie de Validators.email
changera, puis ce validateur personnalisé ne sera plus compatible avec la sortie du validateur angulaire.
Voici ce que vous devez faire pour conserver la compatibilité:
private customEmailValidator(control: AbstractControl): ValidationErrors {
if (!control.value) {
return null;
}
return Validators.email(control);
}
La meilleure solution que j'ai trouvée était la suivante:
<input type="email" name="email" [(ngModel)]="model.Email" [email]="model.Email!='' && model.Email!=null">
Solution de contournement dans les formulaires basés sur des modèles:
<input [(ngModel)]="model.email" [email]="model.email!==''">
Cela a fonctionné pour moi (assurez-vous d'initialiser la valeur du modèle avec une chaîne vide).
Vous pouvez accomplir ce que vous voulez avec un validateur personnalisé. Voici le validateur que j'ai écrit pour le faire fonctionner:
private customEmailValidator(control: AbstractControl): {[key: string]: any} {
const emailError = Validators.email(control);
if (control.value && emailError) {
return {'email': {}};
}
return null;
}
Ensuite, vous pouvez remplacer validators.Push(Validators.email);
par validators.Push(this.customEmailValidator);
Il utilise le validateur de messagerie intégré d'angular mais s'assure également que le contrôle de messagerie a une valeur avant de renvoyer une erreur.
La forme la plus courte pour ce faire serait:
<input [(ngModel)]="model.email" [email]="!!model.email">