Đây là vấn đề của tôi.
Tôi có một JSON động mà tôi cần chuyển đổi thành một biểu mẫu. Vì vậy, tôi đã sử dụng các biểu mẫu phản ứng và bằng cách đi qua tất cả các thuộc tính của JSON, tôi tạo một Formgroup hoặc FormControl, theo cách này:
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);
}
Sau khi làm như vậy, tôi sử dụng các mẫu đệ quy để xây dựng biểu mẫu, nếu tôi không sử dụng các mẫu đệ quy, tôi sẽ nhận được biểu mẫu để làm việc. Tuy nhiên với các mẫu đệ quy tôi đang gặp lỗi:
<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>
CựuComponent.html: 25 Lỗi LRI: Không thể tìm thấy điều khiển với tên: 'đường'
Điều đó tương ứng với JSON mẫu này:
"address": {
"town": "townington",
"county": "Shireshire",
"road": {
"number": "1",
"street": "the street"
}
Tôi đã được hiển thị, vì vậy tôi biết các yếu tố ở đó. Tôi đang thiếu gì?
formGroupName
bằng formGroup
mọi nơi có thể khắc phục vấn đề. Nhưng bạn sẽ cần một cách để lấy FormGroup
ví dụ chính xác cho từng nhóm lồng nhau.
oneOf
từ một tập gọi các mục có thể như name
, personal
, address
vv
[formGroupName]="road"
là không biết rằng nó được lồng trong nhómaddress
. Đó là tìm kiếm một nhóm định dạng được đặt tênroad
trực tiếp dưới thư mục gốc[formGroup]="myForm"
. Nếu bạn lồng mộtroad
nhóm định dạng ngay bên dướimyForm
, bạn sẽ thấy lỗi không còn xuất hiện nữa.