0

这个问题描述起来有点棘手,所以请耐心等待,如果我遗漏了什么,请提出问题......

假设您有一个定义了特征列表的 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

4

0 回答 0