Hier ist mein Problem.
Ich habe einen dynamischen JSON, den ich in ein Formular konvertieren muss. Also habe ich reaktive Formulare verwendet und durch Durchlaufen aller Eigenschaften von JSON entweder eine FormGroup oder FormControl auf folgende Weise erstellt:
sampleJson ={prop1:"value1", prop2: "value2",...}
...
myForm: FormGroup;
myKeys=[];
...
ngOnInit() {
this.myForm = this.getFormGroupControls(this.sampleJson, this.myKeys);
}
getFormGroupControls(json:any,keys): FormGroup{
let controls = {};
let value = {};
for (let key in json) {
if (json.hasOwnProperty(key)) {
value = json[key];
if (value instanceof Object && value.constructor === Object) {
keys.push({"key":key,children:[]});
controls[key] = this.getFormGroupControls(value,keys[keys.length-1].children);
} else {
keys.push({"key":key,children:[]});
controls[key] = new FormControl(value);
}
}
}
return new FormGroup(controls);
}
Danach verwende ich rekursive Vorlagen, um das Formular zu erstellen. Wenn ich keine rekursiven Vorlagen verwende, funktioniert das Formular. Bei rekursiven Vorlagen werden jedoch Fehler angezeigt:
<form [formGroup]="myForm">
<div class="form-group">
<ng-template #nodeTemplateRef let-node>
<div class="node">
<div *ngIf="node.children.length">
{{"section [formGroupName]="}} {{ getNodeKey(node) }}
<section style="display:block;margin:20px;border:solid 1px blue;padding-bottom: 5px;"
[formGroupName]="getNodeKey(node)" >
<h1>{{ node.key }}</h1>
<ng-template
ngFor
[ngForOf]="node.children"
[ngForTemplate]="nodeTemplateRef">
</ng-template>
</section>
{{"end of section"}}
</div>
<div *ngIf="!node.children.length">
<label [for]="node.key">{{node.key}}</label>
<input type="text" [id]="node.key"
class="form-control">
</div>
</div>
</ng-template>
<ng-template *ngFor="let myKey of myKeys"
[ngTemplateOutlet]="nodeTemplateRef"
[ngTemplateOutletContext]="{ $implicit: myKey }">
</ng-template>
</div>
FormerComponent.html: 25 FEHLER Fehler: Kontrolle mit Name: 'Straße' kann nicht gefunden werden.
Das entspricht diesem Beispiel JSON:
"address": {
"town": "townington",
"county": "Shireshire",
"road": {
"number": "1",
"street": "the street"
}
Ich habe angezeigt, also weiß ich, dass die Elemente da sind. Was vermisse ich?
formGroupName
durch formGroup
überall kann das Problem beheben. Sie benötigen jedoch eine Möglichkeit, die richtige FormGroup
Instanz für jede verschachtelte Gruppe zu ermitteln.
oneOf
von einem bekannten Satz von möglichen Einträgen wie name
, personal
, address
usw.
[formGroupName]="road"
ist nicht bekannt, dass es unter deraddress
Formulargruppe verschachtelt ist . Es wird nach einer Formulargruppe gesucht, dieroad
direkt unter der Wurzel benannt ist[formGroup]="myForm"
. Wenn Sie eineroad
Formulargruppe direkt darunter verschachtelnmyForm
, wird der Fehler nicht mehr angezeigt.