这只是一个想法(我没有时间编写代码)。
假设您有一个类似json的
[
{
type: 'input',
label: 'Full name',
name: 'name',
placeholder: 'Enter your name',
validation: '1,2',
args:'null,3'
}
{
type: 'input',
label: 'Full name',
name: 'name2',
placeholder: 'Enter your name2',
validation: '1,2',
args:'null,3'
}
]
您可以使用以下服务:
getFormModel()
{
return httpClient.get("...").pipe(
map(result=>{
result.map(res=>{
let validators=res.validation.split(,)
let args=res.validation.split(,)
let validator:any[]=[]
for (let i=0;i<validators.length;i++)
{
switch (validators[i])
{
case 1:
validator.push(Validators.required);
break;
case 2:
validator.push(Validators.MinLength(+args[i]);
break;
}
return
{
type: res.type,
label: res.label,
name: res.name,
placeholder: res.placeholder,
validators:validator;
}
})
})
)
}
当您订阅时,您可以创建一个表单组并将表单组的模型存储在模型中,如
myservice.getFormModel().subscribe(result=>
let controls:any={}
result.forEach(res=>{
controls[res.name]=new FormControl('', res.validators)
}
this.myForm=FormGroup(controls)
this.model=result;
)
和显示一样
<form formGroupName="myForm">
<div *ngFor="let control in model">
<input [formControlName]="control.name"
[placeholder]="control.placeholder"/>
</div>
</form>
注意:一旦你有了“模型”,你就可以像这样显示控件
the response of the question
(stackblitz更为复杂)