【发布时间】:2020-01-16 18:09:42
【问题描述】:
这是我的问题。
我有一个动态 JSON,需要将其转换为表单。因此,我使用了响应式表单,并通过查看 JSON 的所有属性,以这种方式创建了 FormGroup 或 FormControl:
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);
}
这样做之后,我使用递归模板来构建表单,如果我不使用递归模板,我会让表单工作。但是,使用递归模板时出现错误:
<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 ERROR 错误:找不到名称为“路”的控件
对应于这个示例 JSON:
"address": {
"town": "townington",
"county": "Shireshire",
"road": {
"number": "1",
"street": "the street"
}
我有正在显示,所以我知道元素在那里。我错过了什么?
【问题讨论】:
-
我相信
[formGroupName]="road"不知道它嵌套在address表单组下。它正在直接在根[formGroup]="myForm"下寻找一个名为road的表单组。如果您将road表单组直接嵌套在myForm下,您将看到该错误不再出现。 -
在任何地方将
formGroupName替换为formGroup可能会解决问题。但是您需要一种方法来为每个嵌套组获取正确的FormGroup实例。 -
创建另一个错误> 无法在字符串“名称”上创建属性“验证器”
-
动态 json 总是会返回一个已知的集合吗?这可能会改变,但我们可以意识到它们并有一些类型安全的东西?
-
我想我要问的是:它是真正动态的还是只是
oneOf来自一组已知的可能条目,如name、personal、address等
标签: angular angular-reactive-forms