Angular 2: Nie można powiązać z „ngModel”, ponieważ nie jest to znana właściwość „input”

178

Próbuję wdrożyć Dynamiczne formularze w Angular 2. Dodałem dodatkowe funkcje, takie jak Usuń i Anuluj do dynamicznych formularzy. Postępowałem zgodnie z tą dokumentacją: https://angular.io/docs/ts/latest/cookbook/dynamic-form.html

wprowadź opis zdjęcia tutaj

Wprowadziłem kilka zmian w kodzie. Mam tu błąd.

Jak sprawić, by ten błąd zadziałał?

Pełny kod można znaleźć tutaj: http://plnkr.co/edit/SL949g1hQQrnRUr1XXqt?p=preview , który działa w programie plunker, ale nie w moim systemie lokalnym.

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

Kod komponentu:

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();
  }
}
Varun
źródło
Mam ten sam błąd po aktualizacji. Napiszę tutaj, jeśli znajdę dlaczego.
Carl Boisvert,
1
W porządku, dla mnie zniknął, gdy zaimportowałem FormsModule do mojej deklaracji NgModule. Ale nadal mam błąd z informacją, że „AppComponent nie ma konfiguracji trasy”. nawet jeśli zaimportowałem trasy. Ale sprawdź, czy to rozwiąże twój problem.
Carl Boisvert,
To może pomóc stackoverflow.com/a/49628169/6597375
Deepu Reghunath

Odpowiedzi:

282

Wymyślone szybkie rozwiązanie, zaktualizuj kod @NgModule w następujący sposób:

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

Źródło: Nie można powiązać z „ngModel”, ponieważ nie jest to znana właściwość „input”

wmnitin
źródło
15
Czy to wciąż właściwe rozwiązanie? Wszystko jest dla mnie takie i nadal pojawia się błąd?
FrancescoMussi,
2
Tak, nadal działa, możesz także wypróbować ReactiveFormsModule zamiast FormsModule. Proszę opublikować swój błąd, jeśli taki istnieje.
wmnitin
1
Przepraszam. Mój problem był nieco inny. Pomyślałem, że tutaj: stackoverflow.com/questions/39152071/... Dziękuję za odpowiedź!
FrancescoMussi
29
Wygląda na to, że prawdziwą odpowiedzią było zaimportowanie tego, FormsModulew NgModulektórym zadeklarowałeś swój komponent. Proste powiedzenie „spraw, aby twój NgModule wyglądał tak” nie jest zbyt dobrą odpowiedzią.
WebWanderer
To nie działa, musi to być ReactiveFormsModule
Julius ShadowAspect Flimmel
53

Aby ngModel działał podczas korzystania z AppModules (NgModule), musisz zaimportować FormsModule do swojego AppModule.

Lubię to:

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 {}
Radosvet Petrov
źródło
Musisz dodać FormsModule do importu w module, w którym korzystasz z jego dyrektyw: we wszystkich z nich, prawda?
Marvin Zumbado,
12

Podobny błąd napotkałem po aktualizacji do RC5; tj. Angular 2: Nie można powiązać z „ngModel”, ponieważ nie jest to znana właściwość „input”.

Kod na Plunker pokazuje użycie Angular2 RC4, ale przykładowy kod na https://angular.io/docs/ts/latest/cookbook/dynamic-form.html używa NGModule, który jest częścią RC5. NGModules to przełomowa zmiana z RC4 na RC5.

Ta strona wyjaśnia migrację z RC4 do RC5: https://angular.io/docs/ts/latest/cookbook/rc4-to-rc5.html

Mam nadzieję, że to rozwiązuje występujący błąd i pomaga we właściwym kierunku.

Krótko mówiąc, musiałem utworzyć NGModule w 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 { }

Następnie zmieniłem main.ts, aby użyć modułu:

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

platformBrowserDynamic().bootstrapModule(AppModule);

Oczywiście musiałem również zaktualizować zależności w pliku package.json. Oto moje zależności od package.json. Wprawdzie spętałem je razem z innych źródeł (być może z przykładów doktorów ng), więc przebieg może się różnić:

...
"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"
  },
...

Mam nadzieję, że to pomaga lepiej. :-)

jackfrosch
źródło
1
Zredagowałem odpowiedź, aby uwzględnić konkretne przykłady kodu.
jackfrosch
10
import {FormControl,FormGroup} from '@angular/forms';

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

Powinieneś także dodać brakujące.

Mertcan Diken
źródło
1
Cześć, w moim przypadku jest to rozwiązanie, wydaje się, że grupa Form jest ważną częścią.
Jean Jimenez
8

Właśnie dodałeś FormsModulei zaimportowałeś do FormsModuleswojego app.module.tspliku.

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

imports: [
    BrowserModule, FormsModule 
],

Po prostu dodaj powyższe dwa wiersze do swojego app.module.ts. Działa dobrze.

Kirankumar
źródło
4

Musisz zaimportować FormsModule do @NgModule Decorator, @NgModule jest obecny w pliku moduleName.module.ts.

import { FormsModule } from '@angular/forms';
@NgModule({
   imports: [
      BrowserModule,
      FormsModule
   ],
   declarations: [ AppComponent ],
   bootstrap: [ AppComponent ]
 })
Jawla
źródło
4

Krok do naśladowania

1. Otwórz app.module.ts plik.

.

2. Dodaj import { FormsModule } from '@angular/forms';

.

3. Dodaj FormsModule do importsjakoimports: [ BrowserModule, FormsModule ],

.

Wynik końcowy będzie wyglądał tak

.....
import { FormsModule } from '@angular/forms';
.....
@NgModule({
.....
  imports: [   
     BrowserModule, FormsModule 
  ],
.....
})
Deepu Reghunath
źródło
3

Aby móc korzystać 'ngModule', należy dodać 'FormsModule'(z @angular/forms) do import[]tablicy w AppModule(powinien być domyślnie w projekcie CLI).

Nisarg Patil
źródło
3

Pierwszy import FormsModule z kątowej biblioteki lib i pod NgModule zadeklarował go w imporcie

import { FormsModule } from '@angular/forms';
    @NgModule({
      declarations: [
        AppComponent,
        ],
      imports: [
        BrowserModule,
        FormsModule
      ],
      providers: [],
      bootstrap: [AppComponent]
    })
Gajender Singh
źródło
2

Musisz zaimportować zależność @ angular / form do swojego modułu.

jeśli używasz npm, zainstaluj zależność:

npm install @angular/forms --save

Zaimportuj go do swojego modułu:

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

A jeśli używasz SystemJ do ładowania modułów

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

Teraz możesz używać [(ngModel)] na dwa sposoby wiązania danych.

Yacine
źródło
1

Z jakiegoś powodu w Angular 6 samo importowanie FormsModule nie rozwiązało mojego problemu. Ostatecznie naprawiłem mój problem, dodając

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

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

export class MyClass{
}
Andy Braham
źródło
1

Załóżmy, że Twój stary plik app.module.ts może wyglądać podobnie do tego:

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

Teraz zaimportuj FormsModule do pliku 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 { }

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

Siddhartha Mukherjee
źródło
0

Ta odpowiedź może ci pomóc, jeśli używasz Karmy:

Zrobiłem dokładnie tak, jak wspomniano w odpowiedzi @ wmnitin, ale błąd zawsze występował. Kiedy używasz „ng serw” zamiast „karma start”, działa!

luohf07
źródło
0

Jest to opisane w samouczku Angular: https://angular.io/tutorial/toh-pt1#the-missing-formsmodule

Musisz zaimportować FormsModulei dodać go do importu w @NgModuledeklaracji.

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

@NgModule({
  declarations: [
    AppComponent,
    DynamicConfigComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
K. Gol
źródło