'form'は 'input'の既知のプロパティではないため、バインドできません-Angular2 Material Autocomplete issue


355

Angular 2プロジェクトでAngular Material Autocompleteコンポーネントを使用しようとしています。テンプレートに以下を追加しました。

<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
Pengyyの回答に対する1つのコメント:を使用formControlする場合は、rootModuleではなくReactiveFormsModuleモジュールにインポートする必要があります。機能モジュールで使用する場合に備えて。FormControl
ジョン王

同様のケースがあり、機能にReactiveFormsModuleのインポートがあります。唯一の違いは、「formControl」ではなく「formControlName」にバインドすることです。メッセージは同じ構造を有する
ИскренСтаниславов

ここでの答えは正しいです。しかし、誰かが(私がそうであったように)まだスタックしていて、エラーがformcontrol(小文字)ではなく、「formControlWebpack html-loader」を介してテンプレートを実行している場合、これは役立ちます:stackoverflow.com/a/40626329/287568
Ben Boyle

回答:


758

を使用formControlしている間はReactiveFormsModuleimportsアレイにインポートする必要があります。

例:

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

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

173
本当に、これはなぜではドキュメントにないmaterial.angular.io/components/autocomplete/overviewこのために無駄に多くの時間。どこにでも角度のある魔法の未知の依存関係。
Vadorequest '26

4
@Vadorequest:これらのドキュメントはマテリアル用です。彼らが使用するAngularのすべての機能のドキュメントを追加し始めると、AngularドキュメントとMaterialドキュメントの間に多くの重複が生じ、最終的には同期が失われる可能性があります。しかし、私もこれに頭を悩ませるのにかなりの時間を費やしました。マテリアルgithubリポジトリにいつでも問題を提出できます:github.com/angular/material2/issues
Eric Ihli

22
それは言い訳にはなりません。彼らは何かをすることができました。ある種のヒントにリンクする「一般的なトラブルシューティング」かもしれません。彼らのライブラリが他のネイティブの角度依存に依存している場合、それらの依存関係を強調することも彼らの仕事です。特にこの場合、フレームワークは結局「material.angular.io」にあります。
Vadorequest

3
または、使用しているものに基づいて、これらのタイプのモジュールを自動的に取り込む標準的なツールだけです。Webpackの仕事のように聞こえますか?
2017年

オートコンプリートドキュメントのStackblitzを見ると、ReactiveFormsModuleを使用する必要性は明らかです。より一般的には、どのコンポーネントでも、ページはめ込みコードよりもStackblitzデモの詳細が多くなります...
David Haddad

42

例の.tsを解読することは忘れてください-他の人が言っているように、それはしばしば不完全です。

代わりに、ここで丸で囲まれた「ポップアウト」アイコンをクリックすると、完全に機能するStackBlitzの例が表示されます。

ここに画像の説明を入力してください

必要なモジュールをすばやく確認できます。

ここに画像の説明を入力してください

のインスタンスをコメント化するReactiveFormsModuleと、間違いなくエラーが発生します。

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

ありがとう、正しい方向を教えてくれ、将来どこを見ればいいのかわかった!
m.edmondson 2018年


-1

通常のmatInputをテンプレートに追加することから始めます。入力の値を追跡するためにReactiveFormsModuleのformControlディレクティブを使用しているとしましょう。

リアクティブフォームは、値が時間とともに変化するフォーム入力を処理するためのモデル駆動型アプローチを提供します。このガイドでは、簡単なフォームコントロールを作成および更新する方法、グループで複数のコントロールを使用する方法、フォームの値を検証する方法、およびより高度なフォームを実装する方法について説明します。

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

...

imports: [
    BrowserModule,
    AppRoutingModule,
    HttpModule,
    FormsModule,
    RouterModule,
    ReactiveFormsModule,
    BrowserAnimationsModule,
    MaterialModule],
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.