Açısal 2: Bilinen bir 'input' özelliği olmadığı için 'ngModel'e bağlanamıyor


178

Açısal 2'de Dinamik Formlar uygulamaya çalışıyorum. Dinamik formlara Sil ve İptal gibi ek işlevler ekledim. Bu belgeleri izledim: https://angular.io/docs/ts/latest/cookbook/dynamic-form.html

resim açıklamasını buraya girin

Kodda bazı değişiklikler yaptım. Burada hata alıyorum.

Bu hatayı nasıl yapabilirim?

Kodun tamamını burada bulabilirsiniz: http://plnkr.co/edit/SL949g1hQQrnRUr1XXqt?p=preview , dalgıçta çalışıyor, ancak yerel sistemimde değil.

HTML Kodu:

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

Bileşen kodu:

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

Yükseltmeden sonra aynı hatayla karşılaşıyorum. Nedenini bulursam buraya yazacağım.
Carl Boisvert

1
Tamam, benim için NgModule bildirimimde FormsModule'u içe aktardığımda ortadan kayboldu. Ancak yine de "AppComponent'in hiçbir yapılandırma yapılandırması yok" hatasıyla karşılaşıyorum. rotaları ithal etsem bile. Ancak sorununuzu çözüp çözmediğini kontrol edin.
Carl Boisvert


Yanıtlar:


282

Hızlı bir çözüm buldum, @NgModule kodunuzu şu şekilde güncelleyin:

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

Kaynak: 'input' öğesinin bilinen bir özelliği olmadığından 'ngModel'e bağlanamıyor


15
Bu hala doğru çözüm mü? Benim için her şey böyle ve hala hatayı alıyorum?
FrancescoMussi

2
Evet, hala çalışıyor, FormsModule yerine ReactiveFormsModule'ü de deneyebilirsiniz. Lütfen varsa hatanızı gönderin.
wmnitin

1
Üzgünüm. Benim sorunum biraz farklıydı. Bunu burada anladım: stackoverflow.com/questions/39152071/… Cevabınız için teşekkürler!
FrancescoMussi

29
Gerçek cevap içe gerektiğini olarak göründüğü FormsModuleaynı yer NgModuledaki bileşeni ilan bildirildi. Söyleyerek Basit çok iyi bir cevap değil "bu gibi NgModule görünüm yapmak".
WebWanderer

Aslında çalışmıyor, ReactiveFormsModule olmalı
Julius ShadowAspect Flimmel

53

AppModules'ü (NgModule) kullanırken ngModel'i çalıştırmak için AppModule'nize FormsModule'u içe aktarmanız gerekir.

Bunun gibi:

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

Yönergelerini kullandığınız modüle içe aktarmak için FormsModule eklemeniz gerekir: Hepsinde değil mi?
Marvin Zumbado

12

RC5'e yükselttikten sonra benzer bir hatayla karşılaştım; ie Açısal 2: 'input' öğesinin bilinen bir özelliği olmadığından 'ngModel' öğesine bağlanamıyor.

Plunker'daki kod Angular2 RC4'ü gösteriyor, ancak https://angular.io/docs/ts/latest/cookbook/dynamic-form.html adresindeki örnek kod, RC5'in bir parçası olan NGModule kullanıyor. NGModules, RC4'ten RC5'e kırılan bir değişikliktir.

Bu sayfada RC4'ten RC5'e geçiş açıklanmaktadır: https://angular.io/docs/ts/latest/cookbook/rc4-to-rc5.html

Umarım bu, aldığınız hatayı giderir ve doğru yönde gitmenize yardımcı olur.

Kısacası, app.module.ts içinde bir NGModule oluşturmak zorunda kaldım:

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

Daha sonra modülü kullanmak için main.ts'i değiştirdim:

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

platformBrowserDynamic().bootstrapModule(AppModule);

Tabii ki, package.json'daki bağımlılıkları da güncellemem gerekiyordu. İşte package.json bağımlılıklarım. Kuşkusuz, onları diğer kaynaklardan (belki de ng docs örnekleri) birlikte taktım, böylece kilometreniz değişebilir:

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

Umarım bu daha iyi olur. :-)


1
Cevabı belirli kod örneklerini içerecek şekilde düzenledim.
jackfrosch

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

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

Ayrıca eksik olanları da eklemelisiniz.


1
Merhaba, benim durumumda bu bir çözüm, Form grubunun önemli bir parçası olduğu görülüyor.
Jean Jimenez

8

Sadece eklemek gelmiş FormsModuleve içe FormsModulesizin de app.module.tsdosyaya.

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

imports: [
    BrowserModule, FormsModule 
],

Yukarıdaki iki satırı ekleyin app.module.ts. İyi çalışıyor.


4

@NgModule Dekoratörünüze FormsModule'u içe aktarmanız gerekir, moduleName.module.ts dosyanızda @NgModule bulunur.

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

4

Takip etme adımı

1. açın app.module.ts Dosyanızı .

.

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

.

Ekle 3. FormsModule etmek importsolarakimports: [ BrowserModule, FormsModule ],

.

Nihai sonuç şöyle görünecek

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

3

Kullanabilmeniz için 'ngModule', 'FormsModule'( dizinin) dizinize (CLI projesinde varsayılan olarak orada olması gerekir) dizinize @angular/formseklenmesi gerekir.import[]AppModule


3

İlk ithalat FormsModule açısal lib ve NgModule altında ithalatta ilan etti

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

2

Modülünüze @ açısal / form bağımlılığını almanız gerekir.

npm kullanıyorsanız, bağımlılığı yükleyin:

npm install @angular/forms --save

Modülünüze aktarın:

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

Modülleri yüklemek için SystemJ'ler kullanıyorsanız

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

Artık [(ngModel)] 'i iki şekilde veri tabanı oluşturmak için kullanabilirsiniz.


1

Herhangi bir nedenle Açısal 6'da FormsModule'u içe aktarmak sorunumu çözmedi. Sonunda sorunumu düzelten şey,

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

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

export class MyClass{
}

1

Diyelim ki eski uygulamanız.module.ts buna benzeyebilir:

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

Şimdi FormsModule'u app.module.ts dosyasına aktarı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-known-property-input/


0

Bu cevap Karma kullanıyorsanız size yardımcı olabilir:

Tam olarak @ wmnitin cevabında belirtildiği gibi yaptım, ama hata her zaman oradaydı. "Karma start" yerine "ng serve" kullanıldığında çalışır!


0

Açısal öğreticide açıklanmıştır: https://angular.io/tutorial/toh-pt1#the-missing-formsmodule

Beyannamenizde içe aktarmanız FormsModuleve ithalatlara eklemeniz gerekir @NgModule.

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

@NgModule({
  declarations: [
    AppComponent,
    DynamicConfigComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule,
    FormsModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.