Je me demande s'il est possible d'avoir la validation sous formes réactives sur flou. Pour le moment, vous pouvez définir updateOn: "blur"
mais les valeurs des champs de saisie ne seront pas mises à jour lors de la saisie. Dans mon cas, j'ai besoin que les valeurs soient mises à jour à chaque frappe, car je fais des calculs avec et montre le résultat à l'utilisateur. La validation ne doit avoir lieu que sur flou.
tHX.
ÉDITER:
J'utilise FormBuilder, certains validateurs intégrés et certains validateurs personnalisés. Exemple de code:
let formToMake = {
purpose: [null, Validators.required],
registrationDate: this.fb.group({
day: [null, Validators.required],
month: [null, Validators.required],
year: [null, Validators.required]
}),
isTruth: [null, Validators.compose([checkIfTrue, Validators.required])]
};
Si j'utilise l'événement de flou, je dois faire toute ma validation manuellement, ce qui, à mon avis, n'est pas un bon moyen.
Ce que j'ai finalement fait:
Utilisation de formes réactives:
TS
c'est la forme à faire. J'avais besoin que le productCost et le loanAmount soient validés sur le flou, mais les valeurs elles-mêmes devaient être mises à jour lors du changement. Si vous définissez updateOn: "blur"
la validation a lieu après l'événement de flou, mais les valeurs seront également mises à jour après l'événement de flou.
let formToMake = {
productCost: new FormControl(null, {validators: Validators.required, updateOn: "blur"}),
loanAmount: new FormControl(null, {validators: Validators.compose([Validators.required, Validators.min(2500)]), updateOn: "blur"}),
loanLength: new FormControl(49, {validators: Validators.required, updateOn: "change"})
};
Méthode handleInput :
Pour résoudre ce problème, je viens de créer un gestionnaire d'événements qui sera appelé sur l'événement d'entrée.
TS
handleInput(e: any) {
this.loanAmount = e;
}
HTML
<input class="form__input" type="number" value="{{loanForm.get('loanAmount').value}}" id="loanAmount" formControlName="loanAmount" (input)="handleInput($event.target.value)">
updateOn n'est qu'une méthode d'accès aux propriétés. La balise HTML d'entrée a une liaison d'événement nommée blur pourrait être utilisée pour cette commodité.
URL du document officiel. https://angular.io/guide/user-input#on-blur
Je crois que vous recherchez ng-binding sur l'élément Angular. Par exemple, vous pouvez vous lier aux frappes et flou comme ceci pour le champ de saisie:
<input type=text (blur)="validate()" (keypress)="eventHandler($event)">
eventHandler(event) {
console.log(event, event.keyCode, event.keyIdentifier);
// Update value of string on every keystroke
}
validate() {
// Validation code goes here
}
Vous pouvez également utiliser ngModel et vous n'aurez alors plus à vous soucier de la frappe car la chaîne serait automatiquement mise à jour pour vous. Cela ressemblerait à quelque chose comme ceci:
<input [(ngModel)]="name" (blur)="validate()">
name: string;
validate() {
// Validation code goes here
}
Puisque vous envisagez d'utiliser le module de formulaires réactifs et leur validation, vous pouvez faire quelque chose comme ceci:
Approche par modèle
<input [(ngModel)]="lastname" [ngModelOptions]="{ updateOn: 'blur' }">
La liaison ngModel changera l'entrée à chaque frappe afin que vous n'ayez pas à le faire manuellement. Je suggérerais vraiment d'adopter cette approche puisque c'est ce que vous demandez actuellement de faire.
Approche des formes réactives
this.nameForm = new FormGroup ({
firstname: new FormControl('', {
validators: Validators.required,
updateOn: 'submit'
}),
lastname: new FormControl('', {
validators: Validators.required,
updateOn: 'submit'
})
});
Références: approche SOarticle moyen