558 votes

Impossible de se lier à 'formControl' car il ne s'agit pas d'une propriété connue de 'input' - problème d'autocomplétion matérielle dans Angular2

J'essaie d'utiliser Angular Material Autocomplétion dans mon projet Angular 2. J'ai ajouté ce qui suit à mon modèle.

<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>

Voici mon composant.

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;
    }
}

J'obtiens l'erreur suivante. Il semble que le formControl n'est pas trouvée.

Impossible de se lier à 'formControl' car ce n'est pas une propriété connue de 'input'.

Quel est le problème ici ?

15 votes

Un commentaire à la réponse de Pengyy : En utilisant formControl vous devez importer ReactiveFormsModule à votre module pas module racine . Au cas où vous utiliseriez FormControl dans vos modules de fonctionnalités.

1 votes

J'ai un cas similaire et j'ai l'importation pour ReactiveFormsModule dans ma fonctionnalité. La seule différence est que je voudrais me lier à 'formControlName' au lieu de 'formControl'. Le message a la même structure

1 votes

Les réponses ici sont correctes ; mais si quelqu'un est toujours bloqué (comme je l'étais) et que l'erreur indique formcontrol (en minuscules) plutôt que formControl - si vous exécutez les modèles via le chargeur html de webpack, cela vous aidera : stackoverflow.com/a/40626329/287568

1120voto

Pengyy Points 21772

En utilisant formControl vous devez importer ReactiveFormsModule à votre imports le tableau.

Exemple :

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

@NgModule({
  imports: [
    BrowserModule,
    FormsModule,
    ReactiveFormsModule,
    MaterialModule,
  ],
  ...
})
export class AppModule {}

250 votes

Vraiment, pourquoi ce n'est pas dans la doc à material.angular.io/components/autocomplete/overview tellement de temps perdu pour ça. Des dépendances inconnues magiques partout avec angular.

9 votes

@Vadorequest : Ces documents sont pour le matériel. S'ils commencent à ajouter des docs pour chaque fonctionnalité d'Angular qu'ils utilisent, il pourrait y avoir beaucoup de duplication entre les docs Angular et les docs Material qui finiront par se désynchroniser. Mais j'ai passé une bonne partie du temps à me gratter la tête à ce sujet aussi. Vous pouvez toujours soumettre un problème sur le repo Github de Material : github.com/angular/material2/issues

37 votes

Ce n'est pas une excuse, IMHO. Ils pourraient faire quelque chose à ce sujet, peut-être un "dépannage général" qui renvoie à des sortes de conseils. Si leur bibliothèque dépend d'autres dépendances angulaires natives, c'est aussi leur tâche de mettre en évidence ces dépendances. Surtout dans ce cas, leur framework est sur "material.angular.io" après tout.

67voto

Simon_Weaver Points 31141

N'essayez pas de déchiffrer l'exemple .ts - comme d'autres l'ont dit, il est souvent incomplet.

Au lieu de cela, il suffit de cliquer sur l'icône "pop-out" entourée ici et vous obtiendrez une exemple de StackBlitz entièrement fonctionnel .

enter image description here

Vous pouvez rapidement confirmer les modules requis :

enter image description here

Commentez toutes les occurrences de ReactiveFormsModule et, bien sûr, vous obtiendrez l'erreur :

Template parse errors:
Can't bind to 'formControl' since it isn't a known property of 'input'.

0 votes

Merci, vous m'avez mis dans la bonne direction et je sais où regarder à l'avenir !

33voto

Kshitij Banerjee Points 595

Une autre raison pour laquelle cela peut arriver :

Le composant que vous utilisez formControl n'est pas déclaré dans un module qui importe l'élément ReactiveFormsModule .

Vérifiez donc le module qui déclare le composant qui jette cette erreur.

1 votes

Cela a résolu le problème. Merci

5voto

Dev Better Points 41

À partir de la version 9.1.4, il vous suffit d'importer ReactiveFormsModule

https://angular.io/guide/reactive-forms

0 votes

J'ai fait cela pour la version 11 d'Angular et cela a également fonctionné, merci.

2voto

Zia Khan Points 11

Dans angular 12, le chemin d'importation du module matautocompleteModule a été modifié et il s'agit de a résolu mon problème .... Maintenant, cela ressemble à ceci enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X