ไม่สามารถผูกกับ 'formControl' ได้เนื่องจากไม่ใช่คุณสมบัติที่รู้จักของ 'อินพุต' - ปัญหาการเติมข้อความอัตโนมัติของวัสดุ Angular2


355

ฉันกำลังพยายามใช้ส่วนประกอบการเติมข้อความอัตโนมัติของ Angular ในโครงการ 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' ได้เนื่องจากไม่ใช่คุณสมบัติที่รู้จักของ 'อินพุต'

ปัญหาที่นี่คืออะไร


5
หนึ่งความคิดเห็นที่จะตอบ Pengyy ของ: ในขณะที่ใช้formControlคุณจะต้องนำเข้าReactiveFormsModuleที่คุณโมดูลไม่rootModule ในกรณีที่คุณใช้FormControlในโมดูลคุณสมบัติของคุณ
King John

ฉันมีกรณีที่คล้ายกันและมีการนำเข้าสำหรับ ReactiveFormsModule ในคุณสมบัติของฉัน ข้อแตกต่างคือฉันต้องการผูกกับ 'formControlName' แทน 'formControl' ข้อความมีโครงสร้างเดียวกัน
ИскренСтаниславов

คำตอบที่นี่ถูกต้อง; แต่ถ้าใครยังคงติดอยู่ (เหมือนฉัน) และข้อผิดพลาดบอกว่าformcontrol(ตัวพิมพ์เล็ก) มากกว่าformControl- ถ้าคุณใช้แม่แบบผ่าน webpack html-loader สิ่งนี้จะช่วยได้: stackoverflow.com/a/40626329/287568
Ben Boyle

คำตอบ:


758

ในขณะที่ใช้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 ที่พวกเขาใช้อาจมีการทำซ้ำจำนวนมากระหว่าง Angular docs และเอกสารวัสดุที่จะหลุดออกจากการซิงค์ในที่สุด แต่ฉันใช้เวลาไปกับการเกาหัวด้วย คุณสามารถส่งปัญหาไปที่เนื้อหา github repo: github.com/angular/material2/issues
Eric Ihli

22
นั่นไม่ใช่ข้อแก้ตัวของ IMHO พวกเขาสามารถทำอะไรบางอย่างอาจเป็น "การแก้ไขปัญหาทั่วไป" ที่เชื่อมโยงกับเคล็ดลับบางอย่าง หากห้องสมุดของพวกเขาขึ้นอยู่กับการพึ่งพาเชิงมุมของชนพื้นเมืองอื่น ๆ มันก็เป็นหน้าที่ของพวกเขาที่จะต้องเน้นที่คลังเหล่านั้น โดยเฉพาะอย่างยิ่งในกรณีนี้กรอบของพวกเขาคือ "material.angular.io" หลังจากทั้งหมด
Vadorequest

3
หรือเพียงแค่เครื่องมือมาตรฐานที่จะดึงโมดูลประเภทนี้โดยอัตโนมัติตามสิ่งที่คุณใช้ เสียงเหมือนงานสำหรับ webpack หรือไม่?
ferr

จำเป็นต้องใช้ ReactiveFormsModule ชัดเจนถ้าคุณดูใน Stackblitz ในเอกสารการเติมข้อความอัตโนมัติ โดยทั่วไปแล้วองค์ประกอบใด ๆ จะมีรายละเอียดเพิ่มเติมในการสาธิต 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


-1

เริ่มต้นด้วยการเพิ่ม matInput ปกติลงในแม่แบบของคุณ สมมติว่าคุณกำลังใช้คำสั่ง formControl จาก ReactiveFormsModule เพื่อติดตามค่าของอินพุต

รูปแบบปฏิกิริยามีวิธีการที่ขับเคลื่อนด้วยโมเดลเพื่อจัดการรูปแบบอินพุตที่ค่าเปลี่ยนแปลงตลอดเวลา คำแนะนำนี้แสดงให้คุณเห็นวิธีการสร้างและปรับปรุงการควบคุมแบบฟอร์มอย่างง่ายคืบหน้าไปสู่การใช้การควบคุมหลายอย่างในกลุ่มการตรวจสอบความถูกต้องของค่าแบบฟอร์มและการใช้แบบฟอร์มขั้นสูงเพิ่มเติม

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.