【发布时间】:2019-10-30 19:18:43
【问题描述】:
我正在尝试在 JSON 结构的基础上构建一个动态表单。我想要的是如果第一个下拉列表(或另一个表单控件)中的值发生变化,下一个表单控件的值会自动设置。例如,在下面的 JSON 中:
{
"input_params": [
{
"input_param_id": 1,
"label": "Academic Year",
"name": "p_acad_id",
"type": "select",
"value": "2018-19",
"param_length": 30,
"options": [
{ "label": "(choose one)", "value": "" },
{ "label": "2018-19", "value": "2018-19" },
{ "label": "2019-20", "value": "2019-20" }
],
"query_id": 1
},
{
"input_param_id": 2,
"label": "Session Name",
"name": "p_session_id",
"type": "select",
"value": "Primary",
"param_length": 30,
"options": [
{ "label": "(choose one)", "value": "" },
{ "label": "Primary", "value": "Primary" },
{ "label": "Middle", "value": "Middle" },
{ "label": "Senior", "value": "Senior" }
],
"query_id": 1
},
{
"input_param_id": 3,
"label": "Date From",
"name": "p_date_from_o",
"type": "date",
"param_length": 10,
"value":"2019-06-26",
"query_id": 1
},
{
"input_param_id": 4,
"label": "Date To",
"name": "p_date_to_o",
"type": "date",
"param_length": 10,
"value": "2019-06-26",
"query_id": 1
}
]
}
如果我选择 Academic-Year 的值为“2018-19”,我的第二个表单控件(即会话名称)应自动填充“Primary”值。
这就是我创建表单的方式:
.ts:
createForm(obj){
//console.log("In createForm(), obj is:", JSON.stringify(obj));
//console.log("params_count", obj[0].param_count);
console.log("In create form, obj:", obj);
if(obj.length != 0){
this.input_params = obj[0].input_params;
console.log("In create form where input_params are", obj[0].input_params)
//console.log("input_params: ", JSON.stringify(this.input_params));
const params = this.input_params;
const formGroup = {};
for(let input_param of this.input_params)
{
formGroup[input_param.name] = new FormControl('');
}
this.form = new FormGroup(formGroup);
}
}
<!-- <pre>{{getJsonString()}}</pre> -->
<div class="container-fluid">
<div *ngIf="paramsObj$ != undefined">
<form class = "form-horizontal" novalidate (ngSubmit)="onSubmit(form.value)" [formGroup]="form">
<div *ngFor="let prop of input_params">
<label [attr.for]="prop.name">{{prop.label}}</label>
<div [ngSwitch]="prop.type">
<div class="form-group">
<input *ngSwitchCase="'text'" class="form-control" [formControlName]="prop.name" [id]="prop.input_param_id" [type]="prop.type" [value]="prop.value">
</div>
<div *ngSwitchCase="'select'">
<div class="form-group">
<select [formControlName]="prop.name" class="form-control" [value]="prop.value">
<option *ngFor="let option of prop.options" [value]="option.value">
{{ option.label }}
</option>
</select>
</div>
</div>
<div *ngSwitchCase="'date'">
<div class="form-group">
<input type="date" class="form-control" [formControlName]="prop.name" [id]="prop.input_param_id" [value]="prop.value">
</div>
</div>
</div>
</div>
<p>
<button class="btn btn-success" type="submit">Save</button>
</p>
</form>
</div>
</div>
我在想,在订阅 .valueChanges 时,我可以通过获取表单控件的 ID 来设置表单控件的值。但我被困在这里。有什么方法可以做这样的事情吗?
【问题讨论】:
标签: angular angular6 angular-reactive-forms angular-forms