FormControl e Input não estão funcionando? Resolvendo o problema do Angular Material

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: A dor familiar de todo desenvolvedor Angular

\n\n

Você já passou uma hora procurando um erro que estava escondido literalmente em uma única linha de código? Se você trabalha com Angular Material Autocomplete e se deparou com a mensagem Can't bind to 'formControl' since it isn't a known property of 'input' — você não está sozinho. Essa pergunta no Stack Overflow acumulou milhares de visualizações, e não é à toa. O erro aparece no momento mais inesperado, quando parece que tudo já está funcionando perfeitamente.

\n\n

Neste artigo, vamos analisar as causas do erro, comparar detalhadamente três abordagens para corrigi-lo e mostrar exemplos funcionais em TypeScript. Após a leitura, você será capaz não apenas de consertar o autocomplete, mas também de entender mais profundamente a arquitetura do Angular. Vamos lá!

\n\n

Por que o erro Can't bind to 'formControl' ocorre?

\n\n

Vamos direto ao ponto. O erro aparece quando o Angular tenta vincular a diretiva formControl a um elemento <input>, mas não a encontra no módulo atual. Parece lógico, mas o diabo está nos detalhes.

\n\n

Na verdade, formControl é o seletor de uma diretiva que faz parte do módulo ReactiveFormsModule. Se você esqueceu de importar este módulo ou o importou incorretamente, o Angular simplesmente não sabe o que fazer com o atributo [formControl] no seu input.

\n\n

Aqui está uma situação típica: você cria um novo componente com autocomplete, adiciona FormControl no código TypeScript e, no template, escreve:

\n\n
<input type="text" [formControl]="myControl" [matAutocomplete]="auto">\n<mat-autocomplete #auto="matAutocomplete">\n  <mat-option *ngFor="let option of filteredOptions | async" [value]="option">\n    {{option}}\n  </mat-option>\n</mat-autocomplete>
\n\n

E então — bum! Erro vermelho no console. Familiar? Então continue lendo.

\n\n

Abordagem 1: Importar ReactiveFormsModule (A mais simples e correta)

\n\n

A primeira e mais óbvia maneira é garantir que o ReactiveFormsModule esteja importado no módulo correto. Para componentes standalone (Angular 14+) ou módulos clássicos, o procedimento é um pouco diferente.

\n\n

Para módulos clássicos (NgModule)

\n\n

Abra o arquivo do módulo onde seu componente está registrado (por exemplo, app.module.ts ou shared.module.ts) e adicione a importação:

\n\n
import { ReactiveFormsModule } from '@angular/forms';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatInputModule } from '@angular/material/input';\n\n@NgModule({\n  imports: [\n    ReactiveFormsModule,\n    MatAutocompleteModule,\n    MatInputModule,\n    // outras importações\n  ],\n  // ...\n})\nexport class AppModule { }
\n\n

Importante: Sem o MatInputModule, a diretiva matInput também não funcionará, e você receberá um erro semelhante. Importe todos os três módulos juntos.

\n\n

Para componentes standalone (Angular 14+ e Angular 17)

\n\n

Se você estiver usando a nova arquitetura, a importação é feita diretamente no componente:

\n\n
import { Component } from '@angular/core';\nimport { ReactiveFormsModule, FormControl } from '@angular/forms';\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\nimport { MatInputModule } from '@angular/material/input';\nimport { AsyncPipe } from '@angular/common';\n\n@Component({\n  selector: 'app-search',\n  standalone: true,\n  imports: [\n    ReactiveFormsModule,\n    MatAutocompleteModule,\n    MatInputModule,\n    AsyncPipe\n  ],\n  template: `\n    <input type="text" [formControl]="myControl" [matAutocomplete]="auto">\n    <mat-autocomplete #auto="matAutocomplete">\n      <mat-option *ngFor="let option of filteredOptions | async" [value]="option">\n        {{option}}\n      </mat-option>\n    </mat-                

Blogs

Book Recommendations