这个问题描述起来有点棘手,所以请耐心等待,如果我遗漏了什么,请提出问题......
假设您有一个定义了特征列表的 json 对象,每个特征都具有相同的三个属性,但具有一个具有完全不同结构的属性。例如:
{
features: [
{
id: "feature-a",
enabled: true,
configurationData: {
featureAConfigPropertyA: {
somePrperty: "whatever",
anotherProperty: true
},
featureAConfigPropertyB: "some string"
}
},
{
id: "feature-b",
enabled: true,
configurationData: {
featureBConfigArrayPropertyA: ["some string"],
featureBConfigPropertyB: [
{
"id": "some string",
"name": "some string",
"description": "some string",
"enabled": true
}
]
}
}
]
}
每个特征的实际结构是无关紧要的。我只是试图通过 json 模式来表达这一点,其中每个功能的 configurationData 结构取决于或由其父级的功能 id 值决定。
编辑:我想从技术上讲它不需要依赖,只要 configurationData 的任一结构是功能模式本身上该属性的有效模式。此外,configurationData 中的类型不是任意的,它们始终是本示例中给定功能的两种类型之一。
然而,这需要以一种可以通过 Formly 表达的方式来构建,因为我正在使用它来生成表单。在这种情况下,它将是一个 ObjectFieldTypes 数组,一个用于特征 a,一个用于特征 b,它将枚举三个属性并提供输入字段类型,直到它到达 configurationData,此时它将再次使用 ObjectFieldType,这将现在每个字段类型都不同。
这里的问题是 1)我不确定如何在 json 模式中表达这一点,2)我不能将 patternProperties 之类的东西与 formly 一起使用,因为必须在 json 模式中明确定义属性才能正式呈现每个属性的字段类型。尽管在这种情况下 patternProperties 在技术上是有效的模式,但如果模式没有定义这些属性,那么 FormGroup 上可观察到的 valueChanges 中的模型将完全排除它们。所以我最终会得到:
{
features:[
{
id: "feature-a",
enabled: true,
configurationData: { }
},
{
id: "feature-b",
enabled: true,
configurationData: { }
}
]
}
我已经尝试过 if then else 构造,但我无法判断架构是否错误,或者是否正式不支持这一点。我为此做了一个堆栈闪电战: https ://stackblitz.com/edit/angular-g45ydm?file=src%2Fassets%2Fjson-schema%2Fif_then.json