Não é possível vincular a 'formControl', pois não é uma propriedade conhecida de 'input' - Problema de preenchimento automático de material Angular2

355

Estou tentando usar o componente de preenchimento automático de material angular no meu projeto Angular 2. Eu adicionei o seguinte ao meu modelo.

<md-input-container>
   <input mdInput placeholder="Category" [mdAutocomplete]="auto" [formControl]="stateCtrl">
</md-input-container>

<md-autocomplete #auto="mdAutocomplete">
   <md-option *ngFor="let state of filteredStates | async" [value]="state">
      {{ state }}
   </md-option>
</md-autocomplete>

A seguir está o meu componente.

import {Component, OnInit} from "@angular/core";
import {ActivatedRoute, Router} from "@angular/router";
import {FormControl} from "@angular/forms";

@Component({
    templateUrl: './edit_item.component.html',
    styleUrls: ['./edit_item.component.scss']
})
export class EditItemComponent implements OnInit {
    stateCtrl: FormControl;
    states = [....some data....];

    constructor(private route: ActivatedRoute, private router: Router) {
        this.stateCtrl = new FormControl();
        this.filteredStates = this.stateCtrl.valueChanges.startWith(null).map(name => this.filterStates(name));
    }
    ngOnInit(): void {
    }
    filterStates(val: string) {
        return val ? this.states.filter((s) => new RegExp(val, 'gi').test(s)) : this.states;
    }
}

Estou recebendo o seguinte erro. Parece que a formControldiretiva não está sendo encontrada.

Não é possível vincular a 'formControl', pois não é uma propriedade conhecida de 'input'

Qual é o problema aqui?

Lahiru Chandima
fonte
5
um comentário para a resposta de Pengyy: Enquanto estiver usando formControl, você deve importar ReactiveFormsModulepara o seu módulo , não para o rootModule . Apenas no caso de você usar FormControlem seus módulos de recursos.
King John
Eu tenho um caso semelhante e tenho a importação para ReactiveFormsModule no meu recurso. A única diferença é que eu gostaria de vincular a 'formControlName' em vez de 'formControl'. A mensagem tem a mesma estrutura #
31517
As respostas aqui estão corretas; mas se alguém ainda estiver travado (como eu estava) e o erro formcontrol(minúsculo) em vez de formControl- se você estiver executando modelos através do webpack html-loader, isso ajudará: stackoverflow.com/a/40626329/287568
Ben Boyle

Respostas:

758

Enquanto estiver usando formControl, você deve importar ReactiveFormsModulepara sua importsmatriz.

Exemplo:

import {FormsModule, ReactiveFormsModule} from '@angular/forms';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule,
    MaterialModule,
  ],
  ...
})
export class AppModule {}
Pengyy
fonte
173
Realmente, por que isso não está presente no documento em material.angular.io/components/autocomplete/overview tanto tempo desperdiçado? Dependências mágicas desconhecidas em todos os lugares com angular.
Vadorequest 26/09
4
@ Vadorequest: esses documentos são para material. Se eles começarem a adicionar documentos para todos os recursos do Angular que usarem, poderá haver muita duplicação entre os documentos Angular e os materiais, que eventualmente ficarão fora de sincronia. Mas passei muito tempo coçando a cabeça com isso também. Você sempre pode enviar um problema para o repositório de
Eric Ihli
22
Isso não é desculpa IMHO. Eles poderiam fazer algo a respeito, talvez uma "solução de problemas gerais" relacionada a algum tipo de dicas. Se a biblioteca deles depende de outras dependências angulares nativas, também é tarefa deles destacar esses deps. Especialmente nesse caso, a estrutura deles está em "material.angular.io", afinal.
Vadorequest 30/09
3
Ou apenas uma ferramenta padrão que puxa automaticamente esses tipos de módulos com base no que você está usando. Parece um trabalho para o webpack?
ferr
A necessidade de usar o ReactiveFormsModule é clara se você procurar no Stackblitz nos documentos de preenchimento automático. De modo mais geral, qualquer componente terá mais detalhes em sua demonstração Stackblitz do que o código em páginas ...
David Haddad
42

Esqueça de tentar decifrar o exemplo .ts - como outros já disseram, geralmente é incompleto.

Em vez disso, basta clicar no ícone 'pop-out' circulado aqui e você obterá um exemplo StackBlitz totalmente funcional .

insira a descrição da imagem aqui

Você pode confirmar rapidamente os módulos necessários:

insira a descrição da imagem aqui

Comente todas as instâncias de ReactiveFormsModule, e com certeza você receberá o erro:

Template parse errors:
Can't bind to 'formControl' since it isn't a known property of 'input'. 
Simon_Weaver
fonte
Obrigado, me apontou na direção certa e sei para onde olhar no futuro!
m.edmondson
-1

Comece adicionando um matInput regular ao seu modelo. Vamos supor que você esteja usando a diretiva formControl de ReactiveFormsModule para rastrear o valor da entrada.

Os formulários reativos fornecem uma abordagem orientada a modelo para lidar com entradas de formulário cujos valores mudam ao longo do tempo. Este guia mostra como criar e atualizar um controle de formulário simples, avançar para o uso de vários controles em um grupo, validar valores de formulário e implementar formulários mais avançados.

import { FormsModule, ReactiveFormsModule } from "@angular/forms"; //this to use ngModule

...

imports: [
    BrowserModule,
    AppRoutingModule,
    HttpModule,
    FormsModule,
    RouterModule,
    ReactiveFormsModule,
    BrowserAnimationsModule,
    MaterialModule],
Karim Salih
fonte