Angular 2: Невозможно привязать к ngModel, так как это не известное свойство input

178

Я пытаюсь реализовать Dynamic Forms в Angular 2. Я добавил дополнительные функции, такие как Delete и Cancel, к динамическим формам. Я следил за этой документацией: https://angular.io/docs/ts/latest/cookbook/dynamic-form.html

введите описание изображения здесь

Я сделал некоторые изменения в коде. Я получаю ошибку здесь.

Как мне сделать эту ошибку?

Вы можете найти полный код здесь: http://plnkr.co/edit/SL949g1hQQrnRUr1XXqt?p=preview , который работает в plunker, но не в моей локальной системе.

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>

Код компонента:

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();
  }
}
Варуна
источник
У меня такая же ошибка после обновления. Напишу здесь, если найду почему.
Карл Буасверт
1
Хорошо, для меня это исчезло, когда я импортировал FormsModule в моем объявлении NgModule. Но у меня все еще есть ошибка, говорящая, что у AppComponent нет конфигурации маршрута. даже если я импортировал маршруты. Но проверьте, решит ли это вашу проблему.
Карл Бойсверт
Это может помочь stackoverflow.com/a/49628169/6597375
Дипу Регунат

Ответы:

282

Выяснили быстрое решение, обновите свой код @NgModule следующим образом:

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

Источник: Невозможно связать с 'ngModel', так как это не известное свойство 'input'

wmnitin
источник
15
Это все еще правильное решение? Все для меня так, и все же я получаю ошибку?
FrancescoMussi
2
Да, он все еще работает, вы также можете попробовать ReactiveFormsModule вместо FormsModule. Пожалуйста, опубликуйте свою ошибку, если таковая имеется.
wmnitin
1
Я прошу прощения. Моя проблема была немного другой. Я понял это здесь: stackoverflow.com/questions/39152071/… Спасибо за ответ!
FrancescoMussi
29
Похоже, что реальный ответ состоял в том, что вам нужно импортировать то FormsModuleже самое, в NgModuleкотором вы объявили свой компонент. Простое высказывание «сделать так, чтобы ваш NgModule выглядел так», не очень хороший ответ.
WebWanderer
Это не работает на самом деле, это должен быть ReactiveFormsModule
Julius ShadowAspect Flimmel
53

Чтобы ngModel работал при использовании AppModules (NgModule), вы должны импортировать FormsModule в свой AppModule.

Как это:

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 {}
Радосвет Петров
источник
Вам необходимо добавить FormsModule к импортам в модуле, где вы используете его директивы: во всех из них, верно?
Марвин Зумбадо
12

Я столкнулся с подобной ошибкой после обновления до RC5; то есть Angular 2: Невозможно связать с 'ngModel', так как это не известное свойство 'input'.

Код на Plunker показывает, что вы используете Angular2 RC4, но пример кода на https://angular.io/docs/ts/latest/cookbook/dynamic-form.html использует NGModule, который является частью RC5. NGModules - серьезное изменение с RC4 на RC5.

На этой странице объясняется переход с RC4 на RC5: https://angular.io/docs/ts/latest/cookbook/rc4-to-rc5.html

Я надеюсь, что это устраняет ошибку, которую вы получаете, и помогает вам двигаться в правильном направлении.

Короче говоря, мне пришлось создать NGModule в 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 { }

Затем я изменил main.ts для использования модуля:

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

platformBrowserDynamic().bootstrapModule(AppModule);

Конечно, мне также нужно было обновить зависимости в package.json. Вот мои зависимости от package.json. По общему признанию, я собрал их вместе из других источников (может быть, примеры из ng docs), поэтому ваш пробег может отличаться:

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

Надеюсь, это поможет лучше. :-)

jackfrosch
источник
1
Я отредактировал ответ, чтобы включить конкретные примеры кода.
Jackfrosch
10
import {FormControl,FormGroup} from '@angular/forms';

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

Вы также должны добавить недостающие.

Мерткан Дикен
источник
1
Привет, в моем случае это решение, кажется, что группа Form является важной частью.
Жан Хименес
8

Вы только что добавили FormsModuleи импортировали FormsModuleв ваш app.module.tsфайл.

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

imports: [
    BrowserModule, FormsModule 
],

Просто добавьте две вышеупомянутые строки в свой app.module.ts. Работает нормально.

kirankumar
источник
4

Вам необходимо импортировать FormsModule в ваш @NgModule Decorator, @NgModule присутствует в вашем файле moduleName.module.ts.

import { FormsModule } from '@angular/forms';
@NgModule({
   imports: [
      BrowserModule,
      FormsModule
   ],
   declarations: [ AppComponent ],
   bootstrap: [ AppComponent ]
 })
Jawla
источник
4

Шаг, чтобы следовать

1. Откройте ваш app.module.tsфайл.

,

2. Добавить import { FormsModule } from '@angular/forms';

,

3. Добавить FormsModule в importsкачествеimports: [ BrowserModule, FormsModule ],

,

Конечный результат будет выглядеть так

.....
import { FormsModule } from '@angular/forms';
.....
@NgModule({
.....
  imports: [   
     BrowserModule, FormsModule 
  ],
.....
})
Дипу Регунат
источник
3

Чтобы иметь возможность использовать 'ngModule', 'FormsModule'(из @angular/forms) должен быть добавлен в ваш import[]массив в AppModule(должен быть по умолчанию в проекте CLI).

Нисарг Патил
источник
3

Первый импорт FormsModule из angular lib и под NgModule объявил его в импорте

import { FormsModule } from '@angular/forms';
    @NgModule({
      declarations: [
        AppComponent,
        ],
      imports: [
        BrowserModule,
        FormsModule
      ],
      providers: [],
      bootstrap: [AppComponent]
    })
Гаджендер Сингх
источник
2

Вам необходимо импортировать зависимость @ angular / forms в ваш модуль.

если вы используете npm, установите зависимость:

npm install @angular/forms --save

Импортируйте его в свой модуль:

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

И если вы используете SystemJs для загрузки модулей

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

Теперь вы можете использовать [(ngModel)] для двух способов привязки данных.

Ясин
источник
1

По какой-то причине в Angular 6 простой импорт FormsModule не решил мою проблему. Что, наконец, исправило мою проблему, добавив

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

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

export class MyClass{
}
Энди Брахам
источник
1

Предположим, ваш старый app.module.ts может выглядеть примерно так:

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

Теперь импортируйте FormsModule в ваш 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/

Сиддхартха Мукерджи
источник
0

Этот ответ может помочь вам, если вы используете карму:

Я поступил именно так, как указано в ответе @ wmnitin, но ошибка всегда была. Когда вместо «начала кармы» используется «ng serve», оно работает!

luohf07
источник
0

Это описано в уроке Angular: https://angular.io/tutorial/toh-pt1#the-missing-formsmodule

Вы должны импортировать FormsModule и добавить его к импорту в вашей @NgModuleдекларации.

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

@NgModule({
  declarations: [
    AppComponent,
    DynamicConfigComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
К. Гол
источник