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 нет конфигурации маршрута. даже если я импортировал маршруты. Но проверьте, решит ли это вашу проблему.
Карл Бойсверт


Ответы:


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'


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

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


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. Работает нормально.


4

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

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

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», оно работает!


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]
})
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.