MatFormFieldControl : comprendre l'erreur une fois pour toutes

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : pourquoi votre formulaire Angular crie-t-il une erreur ?

\n

Avez-vous déjà rencontré cette situation : vous écrivez un beau formulaire avec Angular Material, tout semble parfait, mais soudain la console du navigateur affiche le message :

\n
mat-form-field must contain a MatFormFieldControl
\n

Ou, si vous utilisez le mode strict de TypeScript, quelque chose comme :

\n
Error: mat-form-field must contain a MatFormFieldControl. Did you forget to add a directive that implements MatFormFieldControl?
\n

C'est l'une des erreurs les plus populaires sur Stack Overflow (des milliers de vues !), et aujourd'hui nous allons l'analyser en profondeur. Vous apprendrez non seulement comment corriger ce problème, mais aussi pourquoi il se produit. Et surtout, vous apprendrez à créer vos propres contrôles pour Angular Material si le MatInput standard ne vous convient pas.

\n

C'est parti ! 🚀

\n\n

Qu'est-ce que MatFormFieldControl et à quoi sert-il ?

\n

Avant de traiter l'erreur, comprenons l'anatomie d'Angular Material. mat-form-field est un conteneur qui ajoute le style Material Design (label, soulignement, indices, erreurs). Mais à lui seul, il n'affiche rien. Il a besoin d'un "enfant" — une directive ou un composant qui implémente l'interface MatFormFieldControl.

\n

Cette interface (ou classe abstraite) décrit comment le contrôle interagit avec le formulaire : comment obtenir la valeur, comment afficher une erreur, comment gérer le focus. L'implémentation standard est MatInput. Si vous écrivez :

\n
<mat-form-field>\n  <input matInput placeholder="Nom">\n</mat-form-field>
\n

— alors la directive matInput implémente automatiquement MatFormFieldControl.

\n

L'erreur se produit lorsque Angular ne trouve aucun élément enfant avec une telle implémentation. Par exemple :

\n
<mat-form-field>\n  <input placeholder="Nom"> <!-- Pas de matInput ! -->\n</mat-form-field>
\n

Ou lorsque vous essayez d'utiliser un composant personnalisé qui n'a pas connecté l'interface.

\n\n

Causes typiques de l'erreur (et comment les corriger)

\n\n

1. Vous avez oublié d'ajouter la directive matInput

\n

La cause la plus banale. Vous n'avez tout simplement pas spécifié matInput sur l'élément <input>.

\n

Incorrect :

\n
<mat-form-field>\n  <input placeholder="Email">\n</mat-form-field>
\n

Correct :

\n
<mat-form-field>\n  <input matInput placeholder="Email">\n</mat-form-field>
\n

Vérifiez également que vous avez importé MatInputModule dans votre module :

\n
import { MatInputModule } from '@angular/material/input';\n\n@NgModule({\n  imports: [MatInputModule]\n})\nexport class AppModule { }
\n\n

2. Vous utilisez le mauvais élément HTML

\n

MatInput fonctionne uniquement avec <input> et <textarea>. Si vous essayez d'envelopper un simple <div> ou <select> (sans mat-select) dans mat-form-field, vous obtiendrez une erreur.

\n

Incorrect :

\n
<mat-form-field>\n  <div>Du contenu quelconque</div>\n</mat-form-field>
\n

Correct : utilisez les composants Material appropriés :

\n
<mat-form-field>\n  <mat-select placeholder="Ville">\n    <mat-option value="1">Paris</mat-option>\n  </mat-select>\n</mat-form-field>
\n

Pour mat-select, vous devez importer MatSelectModule.

\n\n

3. Le composant personnalisé n'implémente pas MatFormFieldControl

\n

C'est un cas plus complexe. Supposons que vous ayez créé votre propre composant pour la saisie de date ou d'évaluation. Angular Material ne le connaît pas. Vous devez explicitement "lui apprendre".

\n

Blogs

Book Recommendations