MatFormFieldControl: entendendo o erro de uma vez por todas

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que seu formulário Angular está gritando com um erro?

\n

Você já se deparou com a seguinte situação: está escrevendo um formulário bonito no Angular Material, tudo parece perfeito, mas o console do navegador de repente exibe a mensagem:

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

Ou, se você estiver usando o modo estrito do TypeScript, pode aparecer algo como:

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

Este é um dos erros mais populares no Stack Overflow (milhares de visualizações!), e hoje vamos analisá-lo de ponta a ponta. Você aprenderá não apenas como corrigir esse problema, mas também por que ele ocorre. E o principal: aprenderá a criar seus próprios controles para o Angular Material, se o padrão MatInput não atender às suas necessidades.

\n

Vamos lá! 🚀

\n\n

O que é MatFormFieldControl e para que serve?

\n

Antes de tratar o erro, vamos entender a anatomia do Angular Material. mat-form-field é um contêiner que adiciona a estilização do Material Design (rótulo, sublinhado, dicas, erros). Mas por si só ele não exibe nada. Ele precisa de um "filho" — uma diretiva ou componente que implemente a interface MatFormFieldControl.

\n

Essa interface (ou classe abstrata) descreve como o controle interage com o formulário: como obter o valor, como exibir o erro, como lidar com o foco. A implementação padrão é o MatInput. Se você escrever:

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

— a diretiva matInput implementa automaticamente o MatFormFieldControl.

\n

O erro ocorre quando o Angular não encontra nenhum elemento filho com essa implementação. Por exemplo:

\n
<mat-form-field>\n  <input placeholder="Nome"> <!-- Sem matInput! -->\n</mat-form-field>
\n

Ou quando você tenta usar um componente personalizado que não implementou a interface.

\n\n

Causas típicas do erro (e como corrigi-las)

\n\n

1. Esqueceu de adicionar a diretiva matInput

\n

A causa mais simples. Você simplesmente não colocou matInput no elemento <input>.

\n

Incorreto:

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

Correto:

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

Verifique também se você importou o MatInputModule no seu módulo:

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

2. Usando o elemento HTML errado

\n

O MatInput funciona apenas com <input> e <textarea>. Se você tentar envolver um <div> comum ou <select> (sem mat-select) em um mat-form-field, receberá o erro.

\n

Incorreto:

\n
<mat-form-field>\n  <div>Algum conteúdo</div>\n</mat-form-field>
\n

Correto: use os componentes Material apropriados:

\n
<mat-form-field>\n  <mat-select placeholder="Cidade">\n    <mat-option value="1">São Paulo</mat-option>\n  </mat-select>\n</mat-form-field>
\n

Para mat-select, é necessário importar o MatSelectModule.

\n\n

3. Componente personalizado não implementa MatFormFieldControl

\n

Este é um caso mais complexo. Suponha que você criou seu próprio componente para entrada de data ou classificação. O Angular Material não sabe sobre ele. É necessário "ensiná-lo" explicitamente.

\n

Blogs

Book Recommendations