17-6 Conversion formulaire -> Modèle
Il est maintenant temps de soumettre le formulaire!
Vérifier que le formulaire est valide
Avant de faire un envoi au serveur et donc une requête POST
, on doit vérifier que le formulaire est dans un état valide. En effet, dès que le bouton Soumettre
est appuyé, la fonction soumettre()
du composant est appelée. On ne veut pas envoyer l'information au serveur sans vérification que le tout est conforme aux attentes.
Une propriété valid
existe sur l'instance de FormGroup
permettant de valider l'état du formulaire:
soumettre() {
if(this.projetForm.valid){
console.log('valide!');
}
}
Créer une interface pour la requête de création
La création d'un projet ne nécessite pas tous les champs d'un modèle projet. En effet, si on analyse le modèle projet, il comprend les propriétés suivantes:
export interface Projet {
id: number;
nom: string;
description?: string;
image_url?: string;
created_at: string;
updated_at: string;
}
Pour la création d'un projet, nous n'avons pas de id
ou encore de created_at
ou de updated_at
.
Nous allons donc créer une interface qui représente une requête de création.
- Sous le dossier
core
, créez un dossierrequetes
- Ajoutez un fichier
TypeScript
et nommez-leprojet-creer-requete.ts
- Dans ce fichier, définissez une interface appelée
CreerProjetRequete
et assurez-vous qu'elle soit exportée (export
)
export interface ProjetCreerRequete {
nom: string;
description?: string;
image_url?: string;
}
Préparer la requête
Pour envoyer la requête, nous devrons convertir le contenu du formulaire en requête ProjetCreerRequete
.
Essayons ceci:
protected soumettre() {
if(this.projetForm.valid){
const valeurForm = this.projetForm.value;
const projetRequete: ProjetCreerRequete = {
nom: valeurForm.nom,
description: valeurForm.description
}
}
}
Mais cela pose plusieurs problèmes:
valeurForm.nom
etvaleurForm.nom
retournent possiblement une valeurnull
, par exemple si le champ est vide. Nous avons une validation en place, mais le compilateur ne le sait pas lui! Dans la requêteCreerProjetRequete
, nom et description ne sont pas des valeurs optionnelles on encore nullables, elles doivent être de typestring
.
Utiliser l'opérateur !
pour les champs obligatoires
Comme nous avons validé que les données étaient valides (.valid
), on sait que nom
n'est pas null
, ni undefined
.
Ainsi, on peut forcer le compilateur à ignorer la possibilité que la valeur soit null
ou undefined
à l'aide de !
:
protected soumettre() {
if(this.projetForm.valid){
const valeurForm = this.projetForm.value;
const projetRequete: ProjetCreerRequete = {
nom: valeurForm.nom!,
description: valeurForm.description
}
}
}
À l'aide de !
, on dit en quelque sorte au compilateur: ne m'avertit pas sur la possibilité d'un champ null ou undefined, je sais ce que je fais, cette propriété a une valeur!
Gérer les champs optionnels
Pour les champs optionnels (?
), la façon dont le compilateur gère ce type est que le champ peut avoir une valeur OU être undefined. string | undefined
dans le cas de description
, par exemple.
Alors que le type du champ peut être string | null | undefined
:
On peut gérer ce cas de figure de la façon suivante:
protected soumettre() {
if(this.projetForm.valid){
const valeurForm = this.projetForm.value;
const projetRequete: ProjetCreerRequete = {
nom: valeurForm.nom!,
description: valeurForm.description || undefined
}
}
}
Dans le cas où valeurForm.description
est null
ou undefined
, on assigne undefined
à description.