是的,最好的选择是将 xml 转换为 json,然后您可以动态创建 reactive forms。我做了类似的事情,比如我有 json,它具有所有表单创建规则(validaitons、feidl 名称等)
let formFields = [
{
name: 'pickupLocations',
isRequired: true,
isArray: true,
nestedFieldsArr: [
{
name: 'location',
isRequired: true
},
{
name: 'lat',
isRequired: false
},
{
name: 'long',
isRequired: false
},
{
name: 'locationCode',
isRequired: false
},
{
name: 'dateTime',
isRequired: true
}
]
},
{
name: 'deliveryLocations',
isRequired: true,
isArray: true,
nestedFieldsArr: [
{
name: 'location',
isRequired: true
},
{
name: 'lat',
isRequired: false
},
{
name: 'long',
isRequired: false
},
{
name: 'locationCode',
isRequired: false
},
{
name: 'dateTime',
isRequired: true
}
]
},
{
name: 'bidVehicles',
isRequired: true,
isArray: true,
nestedFieldsArr: [
{
name: 'vehicleLoadId',
isRequired: true
},
{
name: 'numberOfVehicles',
isRequired: true
},
{
name: 'loadRequirementId',
isRequired: false,
defaultValue: 1
}
]
},
{
name: 'shipmentWeight',
isRequired: true
},
{
name: 'budgetMin',
isRequired: true
},
]
现在我有了像这样动态创建表单的功能
createForm(fieldsArr: any[]) {
let formObject = {};
fieldsArr.forEach(f => {
formObject[f.name] = f.isArray ? this.fb.array([this.createArrayType(f.nestedFieldsArr)]) : [f.defaultValue ? f.defaultValue : '', f.isRequired ? Validators.required : Validators.nullValidator]
})
return this.fb.group(formObject);
}
createArrayType(nestedFieldsArr: any[]) {
let nestedFormObj = {};
nestedFieldsArr.forEach(f => {
nestedFormObj[f.name] = [f.defaultValue ? f.defaultValue : '', f.isRequired ? Validators.required : Validators.nullValidator]
})
let form = this.fb.group(nestedFormObj);
return form;
}
所以通过这种方式,我有一个 json,其中包含所有 validation 规则、字段名称和 nested array fields。