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


178

Tôi đang cố gắng triển khai Biểu mẫu động trong Angular 2. Tôi đã thêm các chức năng bổ sung như Xóa và Hủy vào biểu mẫu động. Tôi đã theo dõi tài liệu này: https://angular.io/docs/ts/latest/cookbook/dynamic-form.html

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

Tôi đã thực hiện một số thay đổi cho mã. Tôi đang gặp lỗi ở đây.

Làm thế nào để tôi thực hiện lỗi này đi?

Bạn có thể tìm thấy mã đầy đủ ở đây: http://plnkr.co/edit/SL949g1hQQrnRUr1XXqt?p=preview , đang hoạt động trong plunker nhưng không hoạt động trong hệ thống cục bộ của tôi.

Mã HTML:

<div>
  <form [formGroup]="form">

    <div *ngFor="let question of questions" class="form-row">
      <label [attr.for]="question.key">{{question.label}}</label>

  <div [ngSwitch]="question.controlType">

    <input *ngSwitchCase="'textbox'" [formControlName]="question.key"
            [id]="question.key" [type]="question.type" [(ngModel)]="question.value">

    <select [id]="question.key" [(ngModel)]="question.value" *ngSwitchCase="'dropdown'" [formControlName]="question.key" >
      <option *ngFor="let opt of question.options" [ngValue]="opt.key" >{{opt.value}}</option>
    </select>

    <input *ngSwitchCase="'checkbox'"  [(ngModel)]="question.value"
            [id]="question.key" [type]="question.type" (change)="question.value = ck.checked" #ck [ngModelOptions]="{standalone: true}">

  </div> 
  <div class="errorMessage" *ngIf="!form.controls[question.key].valid">{{question.label}} is required</div>
    </div>

    <div class="form-row">
      <button type="submit" [disabled]="!form.valid" (click)="onSubmit()">Save</button>
      <button type="button" class="btn btn-default" (click)="cancel()">Cancel</button>
      <button type="button" class="btn btn-default" (click)="clear()">Clear</button>

    </div>
  </form>

  <div *ngIf="payLoad" class="form-row">
    <strong>Saved the following values</strong><br>{{payLoad}}
  </div>
</div>

Mã thành phần:

import { Component, Input, OnInit }  from '@angular/core';
import { FormGroup, REACTIVE_FORM_DIRECTIVES } from '@angular/forms';
import { QuestionBase }                 from './question-base';
import { QuestionControlService }       from './question-control.service';
import { ControlGroup }     from '@angular/common';
import {ChangeDetectorRef} from '@angular/core';
import { FormsModule }   from '@angular/forms';

@Component({
  selector: 'dynamic-form',
  templateUrl: 'app/dynamicform/form.component.html',
  directives: [REACTIVE_FORM_DIRECTIVES],
  providers:  [QuestionControlService]
})
export class DynamicFormComponent implements OnInit {

  @Input() questions: QuestionBase<any>[] = [];
  form: FormGroup;
  payLoad:any;
  payLoad2:any;
  questiont: QuestionBase<any>;
  questiond: QuestionBase<any>;
  constructor(private qcs: QuestionControlService, private cdr: ChangeDetectorRef) {  }
  ngOnInit() {
    this.form = this.qcs.toFormGroup(this.questions);
    console.log("Form Init",this.questions);
    this.questiont = JSON.parse(JSON.stringify(this.questions));
    this.questiond = JSON.parse(JSON.stringify(this.questions));
  }
  onSubmit() {
    this.payLoad = JSON.stringify(this.form.value);
    this.payLoad2=this.payLoad;
    this.questiont = JSON.parse(JSON.stringify(this.questions));
    console.log("Submitted data",this.questions);
  }
  cancel(){
    console.log("Canceled");
    this.questions = JSON.parse(JSON.stringify(this.questiont));
  }
  clear(){
    this.questions = JSON.parse(JSON.stringify(this.questiond));
    this.questiont = JSON.parse(JSON.stringify(this.questiond));
    console.log("Cleared");
    this.cdr.detectChanges();
  }
}

Tôi có lỗi tương tự sau khi nâng cấp. Sẽ viết ở đây nếu tôi tìm thấy lý do tại sao.
Carl Boisvert

1
Được rồi, đối với tôi nó biến mất khi tôi nhập FormsModule trong khai báo NgModule của mình. Nhưng tôi vẫn gặp lỗi khi nói "AppComponent không có cấu hình tuyến đường." ngay cả khi tôi đã nhập các tuyến đường. Nhưng kiểm tra nếu nó khắc phục vấn đề của bạn.
Carl Boisvert


Câu trả lời:


282

Tìm ra giải pháp nhanh chóng, cập nhật mã @NgModule của bạn như thế này:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';

@NgModule({
imports: [ BrowserModule, FormsModule ],
declarations: [ AppComponent ],
bootstrap: [ AppComponent ]
})

export class AppModule { }

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


15
Đây có phải là giải pháp chính xác? Tất cả mọi thứ đối với tôi là như thế này và tôi vẫn nhận được lỗi?
FrancescoMussi

2
Vâng, nó vẫn hoạt động, bạn cũng có thể thử ReactiveFormsModule thay vì FormsModule. Xin vui lòng gửi lỗi của bạn nếu có.
wmnitin

1
Tôi xin lỗi. Vấn đề của tôi là một cái gì đó hơi khác nhau. Tôi đã tìm ra điều đó ở đây: stackoverflow.com/questions/39152071/ khăn Cảm ơn bạn đã trả lời!
FrancescoMussi

29
Có vẻ như câu trả lời thực sự là bạn cần nhập FormsModulegiống như NgModulebạn đã khai báo thành phần của mình. Câu nói đơn giản "làm cho NgModule của bạn trông như thế này" không phải là một câu trả lời hay.
WebWanderer

Nó không hoạt động thực sự, nó phải là ReactiveFormsModule
Julius ShadowAspect Flimmel

53

Để ngModel hoạt động khi sử dụng AppModules (NgModule), bạn phải nhập FormsModule trong AppModule của mình.

Như thế này:

import { NgModule } from '@angular/core';
import { BrowserModule  } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';

import { AppComponent }   from './app.component';


@NgModule({
    declarations: [AppComponent],
    imports: [BrowserModule, FormsModule],
    bootstrap: [AppComponent]
})
export class AppModule {}

Bạn cần thêm FormsModule để nhập trong mô-đun nơi bạn đang sử dụng các lệnh của nó: Trong tất cả chúng phải không?
Marvin Zumbado

12

Tôi đã gặp một lỗi tương tự sau khi nâng cấp lên RC5; tức là Angular 2: Không thể liên kết với 'ngModel' vì đây không phải là thuộc tính được biết đến của 'đầu vào'.

Mã trên Plunker cho bạn thấy bằng Angular2 RC4, nhưng mã ví dụ tại https://angular.io/docs/ts/latest/cookbook/dynamic-form.html đang sử dụng NGModule là một phần của RC5. NGModules là một sự thay đổi đột phá từ RC4 sang RC5.

Trang này giải thích việc di chuyển từ RC4 sang RC5: https://angular.io/docs/ts/latest/cookbook/rc4-to-rc5.html

Tôi hy vọng điều này sẽ giải quyết lỗi bạn gặp phải và giúp bạn đi đúng hướng.

Nói tóm lại, tôi phải tạo NGModule trong app.module.ts:

import { NgModule }      from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule }   from '@angular/forms';

import { AppComponent }  from './app.component';

@NgModule({
    imports:      [ BrowserModule, FormsModule ],
    declarations: [ AppComponent ],
    bootstrap:    [ AppComponent ]
})
export class AppModule { }

Sau đó tôi đã thay đổi main.ts để sử dụng mô-đun:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app.module';

platformBrowserDynamic().bootstrapModule(AppModule);

Tất nhiên, tôi cũng cần cập nhật các phụ thuộc trong gói.json. Đây là phần phụ thuộc của tôi từ pack.json. Phải thừa nhận rằng, tôi đã ghép chúng lại với nhau từ các nguồn khác (có thể là ví dụ về tài liệu ng), vì vậy số dặm của bạn có thể thay đổi:

...
"dependencies": {
    "@angular/common": "2.0.0-rc.5",
    "@angular/compiler": "2.0.0-rc.5",
    "@angular/core": "2.0.0-rc.5",
    "@angular/forms": "0.3.0",
    "@angular/http": "2.0.0-rc.5",
    "@angular/platform-browser": "2.0.0-rc.5",
    "@angular/platform-browser-dynamic": "2.0.0-rc.5",
    "@angular/router": "3.0.0-rc.1",
    "@angular/router-deprecated": "2.0.0-rc.2",
    "@angular/upgrade": "2.0.0-rc.5",
    "systemjs": "0.19.27",
    "core-js": "^2.4.0",
    "reflect-metadata": "^0.1.3",
    "rxjs": "5.0.0-beta.6",
    "zone.js": "^0.6.12",
    "angular2-in-memory-web-api": "0.0.15",
    "bootstrap": "^3.3.6"
  },
...

Tôi hy vọng điều này sẽ giúp tốt hơn. :-)


1
Tôi chỉnh sửa câu trả lời để bao gồm các ví dụ mã cụ thể.
jackfrosch

10
import {FormControl,FormGroup} from '@angular/forms';

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

Bạn cũng nên thêm những cái còn thiếu.


1
Xin chào, trong trường hợp của tôi đây là một giải pháp, có vẻ như nhóm Form là một phần quan trọng.
Jean Jimenez

8

Bạn chỉ cần thêm FormsModulevà nhập tệp FormsModuletrong app.module.tstệp của bạn .

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

imports: [
    BrowserModule, FormsModule 
],

Chỉ cần thêm hai dòng trên trong của bạn app.module.ts. Nó hoạt động tốt.


4

Bạn cần nhập FormsModule trong Trình trang trí @NgModule của bạn, @NgModule có trong tệp moduleName.module.ts của bạn.

import { FormsModule } from '@angular/forms';
@NgModule({
   imports: [
      BrowserModule,
      FormsModule
   ],
   declarations: [ AppComponent ],
   bootstrap: [ AppComponent ]
 })

4

Bước để làm theo

1. Mở app.module.tstệp của bạn .

.

2. Thêm import { FormsModule } from '@angular/forms';

.

3. Thêm FormsModule vào importsnhưimports: [ BrowserModule, FormsModule ],

.

Kết quả cuối cùng sẽ như thế này

.....
import { FormsModule } from '@angular/forms';
.....
@NgModule({
.....
  imports: [   
     BrowserModule, FormsModule 
  ],
.....
})

3

Để có thể sử dụng 'ngModule', 'FormsModule'(từ @angular/forms) cần phải được thêm vào import[]mảng của bạn trong AppModule(nên có ở đó theo mặc định trong dự án CLI).


3

Lần đầu tiên nhập FormsModule từ lib góc và dưới NgModule đã khai báo nó trong nhập khẩu

import { FormsModule } from '@angular/forms';
    @NgModule({
      declarations: [
        AppComponent,
        ],
      imports: [
        BrowserModule,
        FormsModule
      ],
      providers: [],
      bootstrap: [AppComponent]
    })

2

Bạn cần nhập phụ thuộc @ angular / Forms vào mô-đun của mình.

nếu bạn đang sử dụng npm, hãy cài đặt phần phụ thuộc:

npm install @angular/forms --save

Nhập nó vào mô-đun của bạn:

import {FormsModule} from '@angular/forms';
@NgModule({
    imports: [.., FormsModule,..],
    declarations: [......],
    bootstrap: [......]
})

Và nếu bạn đang sử dụng SystemJs để tải các mô-đun

'@angular/forms': 'node_modules/@angular/forms/bundles/forms.umd.js',

Bây giờ bạn có thể sử dụng [(ngModel)] cho hai cách cơ sở dữ liệu.


1

Vì một số lý do trong Angular 6, chỉ cần nhập FormsModule đã không khắc phục được sự cố của tôi. Điều cuối cùng đã khắc phục vấn đề của tôi là bằng cách thêm

import { CommonModule } from '@angular/common';

@NgModule({
  imports: [CommonModule],
})

export class MyClass{
}

1

Giả sử, app.module.ts cũ của bạn có thể trông giống như thế này:

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { AppComponent } from './app.component';

@NgModule({
    imports: [ BrowserModule ],
    declarations: [ AppComponent ],
    bootstrap: [ AppComponent ]
})

export class AppModule { }

Bây giờ, nhập FormsModule trong app.module.ts của bạn

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';
import { AppComponent } from './app.component';

@NgModule({
    imports: [ BrowserModule, FormsModule ],
    declarations: [ AppComponent ],
    bootstrap: [ AppComponent ]
})

export class AppModule { }

http://jsconfig.com/solution-cant-bind-ngmodel-since-isnt- Unknown-property-input/


0

Câu trả lời này có thể giúp bạn nếu bạn đang sử dụng Karma:

Tôi đã làm chính xác như được đề cập trong câu trả lời của @ wmnitin, nhưng lỗi vẫn luôn tồn tại. Khi sử dụng "ng phục vụ" thay vì "nghiệp bắt đầu", nó hoạt động


0

Nó được mô tả trong hướng dẫn Angular: https://angular.io/tutorial/toh-pt1#the-missing-formsmodule

Bạn phải nhập FormsModulevà thêm nó vào nhập trong khai báo của bạn @NgModule.

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

@NgModule({
  declarations: [
    AppComponent,
    DynamicConfigComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
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.