Không thể liên kết với 'formControl' vì đây không phải là thuộc tính đã biết của 'đầu vào' - Sự cố tự động hoàn thành vật liệu Angular2


355

Tôi đang cố gắng sử dụng thành phần Angular Material Autocomplete trong dự án Angular 2 của tôi. Tôi đã thêm vào sau đây vào mẫu của tôi.

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

Sau đây là thành phần của tôi.

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

Tôi nhận được lỗi sau. Có vẻ như lệnh formControlnày không được tìm thấy.

Không thể liên kết với 'formControl' vì đây không phải là thuộc tính được biết đến của 'đầu vào'

Vấn đề ở đây là gì?


5
một nhận xét cho câu trả lời của Pengyy: Trong khi sử dụng formControl, bạn phải nhập ReactiveFormsModulevào mô-đun của mình , không phải rootModule . Chỉ trong trường hợp bạn sử dụng FormControltrong các mô-đun tính năng của bạn.
Vua John

Tôi có trường hợp tương tự và có nhập khẩu ReactiveFormsModule trong tính năng của tôi. Sự khác biệt duy nhất là tôi muốn liên kết với 'formControlName' thay vì 'formControl'. Thông điệp có cùng cấu trúc
Искрен Станиславов

Các câu trả lời ở đây là chính xác; nhưng nếu bất cứ ai vẫn bị mắc kẹt (như tôi) và lỗi nói formcontrol(chữ thường) chứ không phải formControl- nếu bạn đang chạy các mẫu thông qua trình tải webpack html, điều này sẽ giúp: stackoverflow.com/a/40626329/287568
Ben Boyle

Câu trả lời:


758

Trong khi sử dụng formControl, bạn phải nhập ReactiveFormsModulevào importsmảng của bạn .

Thí dụ:

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

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

173
Thực sự, tại sao điều này không có trong tài liệu tại Material.angular.io/components/autocomplete/overview rất nhiều thời gian lãng phí cho việc này. Magical phụ thuộc không biết ở khắp mọi nơi với góc cạnh.
Vadorequest

4
@Vadorequest: Những tài liệu đó là dành cho Tài liệu. Nếu họ bắt đầu thêm tài liệu cho mọi tính năng của Angular mà họ sử dụng, cuối cùng có thể có rất nhiều sự trùng lặp giữa các tài liệu Angular và tài liệu Vật liệu cuối cùng sẽ không đồng bộ. Nhưng tôi cũng dành một khoảng thời gian để gãi đầu. Bạn luôn có thể gửi một vấn đề đến tài liệu github repo: github.com/angular/m
Material2/issues

22
Đó không phải là lý do IMHO. Họ có thể làm một cái gì đó về, có thể là "khắc phục sự cố chung" liên kết đến một số loại mẹo. Nếu thư viện của họ phụ thuộc vào các phụ thuộc góc khác, thì đó cũng là nhiệm vụ của họ để làm nổi bật các deps đó. Đặc biệt trong trường hợp này, khuôn khổ của họ là về "liệu.angular.io".
Vadorequest

3
Hoặc chỉ là một công cụ tiêu chuẩn tự động lấy các loại mô-đun này dựa trên những gì bạn đang sử dụng. Âm thanh như một công việc cho webpack?
ferr

Nhu cầu sử dụng ReactiveFormsModule rất rõ ràng nếu bạn xem trong Stackblitz trong các tài liệu tự động hoàn thành. Tổng quát hơn, bất kỳ thành phần nào cũng sẽ có nhiều chi tiết hơn trong bản demo Stackblitz của nó so với mã trong trang ...
David Haddad

42

Quên cố gắng giải mã ví dụ .ts - như những người khác đã nói nó thường không đầy đủ.

Thay vào đó, chỉ cần nhấp vào biểu tượng 'bật ra' được khoanh tròn ở đây và bạn sẽ có được một ví dụ StackBlitz hoạt động đầy đủ .

nhập mô tả hình ảnh ở đây

Bạn có thể nhanh chóng xác nhận các mô-đun cần thiết:

nhập mô tả hình ảnh ở đây

Nhận xét bất kỳ trường hợp nào ReactiveFormsModulevà chắc chắn bạn sẽ gặp lỗi:

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

Cảm ơn, chỉ cho tôi đi đúng hướng và biết nơi để tìm trong tương lai!
m.edmondson


-1

Bắt đầu bằng cách thêm một matInput thông thường vào mẫu của bạn. Giả sử bạn đang sử dụng chỉ thị formControl từ ReactiveFormsModule để theo dõi giá trị của đầu vào.

Các hình thức phản ứng cung cấp một cách tiếp cận theo mô hình để xử lý các đầu vào của biểu mẫu có giá trị thay đổi theo thời gian. Hướng dẫn này chỉ cho bạn cách tạo và cập nhật điều khiển biểu mẫu đơn giản, tiến tới sử dụng nhiều điều khiển trong một nhóm, xác thực giá trị biểu mẫu và triển khai các biểu mẫu nâng cao hơn.

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

...

imports: [
    BrowserModule,
    AppRoutingModule,
    HttpModule,
    FormsModule,
    RouterModule,
    ReactiveFormsModule,
    BrowserAnimationsModule,
    MaterialModule],
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.