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
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();
}
}
Odpowiedzi:
Wymyślone szybkie rozwiązanie, zaktualizuj kod @NgModule w następujący sposób:
Źródło: Nie można powiązać z „ngModel”, ponieważ nie jest to znana właściwość „input”
źródło
FormsModule
wNgModule
którym zadeklarowałeś swój komponent. Proste powiedzenie „spraw, aby twój NgModule wyglądał tak” nie jest zbyt dobrą odpowiedzią.Aby ngModel działał podczas korzystania z AppModules (NgModule), musisz zaimportować FormsModule do swojego AppModule.
Lubię to:
źródło
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:
Następnie zmieniłem main.ts, aby użyć modułu:
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ć:
Mam nadzieję, że to pomaga lepiej. :-)
źródło
Powinieneś także dodać brakujące.
źródło
Właśnie dodałeś
FormsModule
i zaimportowałeś doFormsModule
swojegoapp.module.ts
pliku.Po prostu dodaj powyższe dwa wiersze do swojego
app.module.ts
. Działa dobrze.źródło
Musisz zaimportować FormsModule do @NgModule Decorator, @NgModule jest obecny w pliku moduleName.module.ts.
źródło
Krok do naśladowania
1. Otwórzapp.module.ts
plik..
2. Dodajimport { FormsModule } from '@angular/forms';
.
3. DodajFormsModule
doimports
jakoimports: [ BrowserModule, FormsModule ],
.
Wynik końcowy będzie wyglądał tak
źródło
Aby móc korzystać
'ngModule'
, należy dodać'FormsModule'
(z@angular/forms
) doimport[]
tablicy wAppModule
(powinien być domyślnie w projekcie CLI).źródło
Pierwszy import FormsModule z kątowej biblioteki lib i pod NgModule zadeklarował go w imporcie
źródło
Musisz zaimportować zależność @ angular / form do swojego modułu.
jeśli używasz npm, zainstaluj zależność:
Zaimportuj go do swojego modułu:
A jeśli używasz SystemJ do ładowania modułów
Teraz możesz używać [(ngModel)] na dwa sposoby wiązania danych.
źródło
Z jakiegoś powodu w Angular 6 samo importowanie FormsModule nie rozwiązało mojego problemu. Ostatecznie naprawiłem mój problem, dodając
źródło
Załóżmy, że Twój stary plik app.module.ts może wyglądać podobnie do tego:
Teraz zaimportuj FormsModule do pliku app.module.ts
http://jsconfig.com/solution-cant-bind-ngmodel-since-isnt-known-property-input/
źródło
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!
źródło
Jest to opisane w samouczku Angular: https://angular.io/tutorial/toh-pt1#the-missing-formsmodule
Musisz zaimportować
FormsModule
i dodać go do importu w@NgModule
deklaracji.źródło