重复字段组

对象数组需要用普通字段填写,而不是整段编辑 JSON 时,可以使用重复字段组。工作流路由、收件人、请求头、工具参数和审批步骤都是常见场景。

绑定行模板

Schema 决定数组和对象结构。一个 repeater 节点绑定数组,它的子字段绑定到 items 下面。

schema: {
  type: 'object',
  properties: {
    routes: {
      type: 'array',
      maxItems: 12,
      items: {
        type: 'object',
        properties: {
          match: { type: 'string', default: 'customer' },
          route: { type: 'string', minLength: 1, default: 'customer' },
        },
        required: ['match', 'route'],
        additionalProperties: false,
      },
    },
  },
},
ui: {
  root: 'root',
  nodes: [
    { id: 'root', kind: 'root', children: ['routes'] },
    {
      id: 'routes',
      kind: 'repeater',
      label: '路由规则',
      schemaPath: '/properties/routes',
      children: ['route-match', 'route-name'],
    },
    {
      id: 'route-match',
      kind: 'field',
      label: '匹配条件',
      schemaPath: '/properties/routes/items/properties/match',
      width: 6,
    },
    {
      id: 'route-name',
      kind: 'field',
      label: '目标路由',
      schemaPath: '/properties/routes/items/properties/route',
      width: 6,
    },
  ],
},

编译器生成 routes.*.match 这样的路径模板,Renderer 在具体行解析为 routes.1.match。嵌套重复组每深入一层就增加一个索引。宿主错误和字段异步校验都使用实际路径。

选择行标识协议

默认使用运行时标识。它可以在本地插入、编辑、移动和删除时保留字段状态,又不会改变受控值。

如果外部状态仓库会整体替换行对象,宿主可以提供 hostAdapter.identifyRepeaterItem,从已有业务数据中推导 key。回调不能修改对象;标识重复、缺失或不合法时会回退到运行时 key。

UiNode.itemKey 是可选项。只有 item Schema 把对应属性声明为必填字符串时,编译器才会接受它。新行会生成该值,因为文档已经明确把标识纳入业务值协议。不要为了引擎内部需要给工作流配置增加 rowId

运行时行为

  • 添加、删除、上移和下移都会回传完整受控值。
  • 到达 minItemsmaxItems 边界时,相应操作会禁用。
  • 只读状态覆盖行字段、排序、添加、删除和表单操作。
  • 校验摘要会聚焦到准确的嵌套输入框。
  • 嵌入容器变窄时,行内网格自动变为单列。
  • 基础类型数组继续使用紧凑的重复项控件。

把规则与数据源绑定到当前行

需要逐项运行的 computedvalidatevisibleenabled 规则必须设置 scope: "row"。文档中的路径保留模板形式:

{
  id: 'route-must-differ-from-default',
  target: 'route-name',
  kind: 'validate',
  scope: 'row',
  expression: {
    op: 'ne',
    left: { op: 'field', path: 'routes.*.route' },
    right: { op: 'field', path: 'default' },
  },
}

行表达式可以读取全局路径、当前行或嵌套结构中的外层行。错误与轨迹使用实际路径,计算失败和增量缓存限制在当前实际行内。

数据源依赖使用相同模板。对于 routes.*.provider,第三行请求会在 request.scope.dependencies 中同时带上模板和 routes.2.provider。宿主按实际路径读取受控值,不需要保存行元数据。

Playground 的 Router 表单是工作流节点参考示例。它的 routes 值仍是普通 { when, route }[],同时具备行校验和宿主管理的逐行选项。

当前边界

直接字段需要紧凑比较时可使用数据表格。弹窗编辑、矩阵、批量表格操作和大数组虚拟滚动仍属于后续工作。