Неможливо прив’язати до 'formControl', оскільки це невідома властивість 'input' - випуск автозаповнення Angular2 Material


354

Я намагаюся використовувати компонент Angular Material Autocomplete у своєму проекті Angular 2. Я додав у свій шаблон наступне.

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

Слідом - мій компонент.

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

Я отримую таку помилку. Схоже, formControlдиректива не знайдена.

Неможливо прив’язати до 'formControl', оскільки це не відома властивість 'input'

У чому тут питання?


5
один коментар до відповіді Пенгі: Під час використання formControlви повинні імпортувати ReactiveFormsModuleдо свого модуля , а не rootModule . Про всяк випадок, якщо ви використовуєте FormControlу своїх функціональних модулях.
Король Джон

У мене є подібний випадок і в моїй функції є імпорт для ReactiveFormsModule. Єдина відмінність полягає в тому, що я хотів би прив’язати до "formControlName" замість "formControl". Повідомлення має таку ж структуру
Іскрен Станиславов

Тут відповіді правильні; але якщо хтось все ще застряг (як я), а помилка каже formcontrol(малі), а не formControl- якщо ви запускаєте шаблони через webpack html-loader, це допоможе: stackoverflow.com/a/40626329/287568
Бен Бойл

Відповіді:


757

Під час використання formControlвам потрібно імпортувати ReactiveFormsModuleдо свого importsмасиву.

Приклад:

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

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

173
Дійсно, чому цього немає в документі на material.angular.io/components/autocomplete/overview, на це витрачено стільки часу. Магічні невідомі залежності скрізь із кутовими.
Vadorequest

4
@Vadorequest: ці документи призначені для матеріалу. Якщо вони почнуть додавати документи для кожної функції Angular, яку вони використовують, може виникнути багато дублювання між кутовими документами та Документами Матеріали, які згодом вибудуть із синхронізації. Але я витратив дуже багато часу, чухаючи голову і на цьому. Ви завжди можете подати питання до матеріалу github repo: github.com/angular/material2/isissue
Ерік Ілі

22
Це не виправдання ІМХО. Вони могли щось зробити, можливо, "загальні несправності", які посилаються на якісь поради. Якщо їхня бібліотека залежить від інших природних кутових залежностей, це також їх завдання виділити ці місця. Тим більше, що в цьому випадку їх рамки є "material.angular.io".
Vadorequest

3
Або просто стандартний інструментарій, який автоматично запускає такі типи модулів на основі того, що ви використовуєте. Здається, як робота для webpack?
ferr

Необхідність використання ReactiveFormsModule зрозуміла, якщо заглянути в Stackblitz в документах автозаповнення. Загалом, будь-який компонент матиме більше деталей у демонстраційній програмі Stackblitz, ніж код на сторінці ...
Девід Хаддад,

42

Забудьте пробувати розшифрувати приклад .ts - як казали інші, це часто неповно.

Замість цього просто натисніть на значок "спливаючого вікна", закрученим тут, і ви отримаєте повністю працюючий приклад StackBlitz .

введіть тут опис зображення

Ви можете швидко підтвердити необхідні модулі:

введіть тут опис зображення

Прокоментуйте будь-які випадки ReactiveFormsModule, і ви точно отримаєте помилку:

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

Дякую, вказав мені в правильному напрямку та знаю, куди дивитись у майбутньому!
m.edmondson


-1

Почніть з додавання звичайного matInput у ваш шаблон. Припустимо, ви використовуєте директиву formControl від ReactiveFormsModule для відстеження значення вхідних даних.

Реактивні форми забезпечують модельний підхід до обробки входів форм, значення яких змінюються з часом. У цьому посібнику ви знайдете, як створити та оновити простий контроль форми, перейти до використання декількох елементів керування в групі, перевірити значення форм та реалізувати більш розширені форми.

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

...

imports: [
    BrowserModule,
    AppRoutingModule,
    HttpModule,
    FormsModule,
    RouterModule,
    ReactiveFormsModule,
    BrowserAnimationsModule,
    MaterialModule],
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.