跳到主要内容

Link field

背景

Link field 或者称之为虚拟字段,是 ACL 或者 Select 输入组件的属性;应用于两个表单相互引用时,解决数据冗余和数据一致性问题的解决方案。

ACL 和 Select 组件的典型用法

ACL (Auto Completion List 的英文首字母简写) 和 Select 两个输入组件都用于便捷地填写表单,所填写的内容来自于其他表单或者 Rest API 数据源。 当 ACLSelect 引用其他表单时,能确保不同表单之间的数据一致性。

比如: 要设计一个员工表单,表单里面展示每个员工所属的部门名称。

可以在员工表单里面添加一个组件类型为 ACL 的部门字段,它引用 部门 表单,展示的内容为部门的名称。 前提:你已经设计好了部门表单,该表单中含有 deptName 部门名称字段。

员工表单中添加一个ACL输入组件,在ACL的属性栏里面找到数据源设置选项,点击数据源,在下拉列表中找到部门表单, 选择部门表单,其他选项保持缺省值即可,表单设计器会为你填写最基本的配置项。你会看到在选中项显示的名称中已经填写了部门名称, 你也可以从下拉选择列表中选择其他字段用于展示部门信息。

在使用员工表单填写员工信息的时候,只需要点击ACL右边的选择按钮,系统将列出可选的所有部门信息,你只需要勾选其中的一个或多个(配置为多选的情况)就完成了员工和部门之间的关联。

在展示员工表单时,你所选的部门名称将展示在组件中,如果是多选,多个部门名称将以分隔符分隔显示在组件中。

staff-form-zh

ACLSelect 两个组件的功能和配置几乎相同。区别在于前端展示形式,Select 是一个下拉列表,用于选择项目比较少的情况; 而 ACL 会弹出一个可选择的表单,列出可供选择的多条记录,并展示引用记录的多个字段。

以上示例的JSON配置如下,请关注其中的 dataSource, mapping 和 multiple 的设置:

{
"component": "ACL",
"id": "dept",
"title": "部门",
"componentProps": {
"dataSource": {
"token": "test-dept-form"
},
"mapping": {
"value": "id",
"label": "deptName"
},
"multiple": true
}
}

其中 "test-dept-form" 为 部门表单的tokenmultipletrue 表示可多选。

在后端存储数据时,员工表单中的dept字段存储了其相关部门信息的id。如 Alice 员工属于 Sale 部门,部门Sales 的 id 为 1001, 则 Alice 员工记录的 dept 字段实际存储了 1001

当两个表单中的各有一个ACL字段关联对方时,我们可以将这两个关联字段绑定,并称之为互引用关系。Ceta 专为互引用关系的字段设计了Link属性。

我们先假设两个互引用的ACL字段都存储引用记录的值,这样会带来两个问题:

  1. 存储冗余: 双方都存有对方的引用值,通常是id
  2. 数据同步: 引用修改的时候, 两边需要同时修改

为解决上述两个问题,我们引入了 Link 属性,Ceta 后端针对设置该属性的字段做了特殊处理。

继续以上述员工部门两个表单作为示例,并考虑如下情况:

部门表中添加一个字段 员工列表 (ACL多选字段)用于展示一个部门的所有人员。 凡是设置了Sales部门的员工,都将展示在Sales部门的表单的员工列表字段中。

当你在部门表中添加ACL字段员工列表并选择数据源为员工表单时,ACL的属性栏中位于数据源设置的下方将会出现Link属性,在该属性的下拉框中选择dept字段,设置员工列表字段为Link字段,指示了员工列表字段与员工表中的deptACL字段绑定为互引用关系。

Link属性的字段,可以将其理解为虚拟字段,它并没有实际的存储,它依赖于其所绑定的互引用字段的存储。 在展示数据时,后端服务通过分析互引用字段(员工表的dept字段)中存储的关联关系,找出该部门的所有员工列表。

dept-form-zh

上图中,link 字段所指定的 部门 对应于数据源 staff 员工表的ACL字段 部门

当逐个编辑员工 Alice,Bob,Chris,Dony 的信息时,将他们的部门设置为 Sales, 这些员工的dept字段中存有Sales部门的 id 1001。 在你展示 Sales 部门的信息时,后端通过 Sales 部门的 id 筛选出dept = 1001的员工列表。

便捷之处在于,当你编辑Sales部门的时候,你可以添加或者删除员工,获得一份新的员工列表,保存之后,后端将同步变更这些员工的部门信息为Sales,并变更移除的员工的部门信息为空内容。为批量修改员工的部门信息提供了快捷的方式。

注意:

  1. 互引用关系的两个字段不能同时设置Link属性。最好的方法是将 ACL/Select 单选的一方设为实际引用,而 ACL 多选的一方设置 Link 属性。 如果双方都为多选,或者双方都为单选,则将经常需要编辑的一方设置为实际引用,而经常需要展示的一方设置Link属性。

  2. 如果不设置为互引用关系,可以在Link属性的下拉选择中选择None。如: 部门表中添加一个ACL字段 manager,代表一个部门的部门经理, 它引用员工表(部门经理也是公司员工)。这种情况,manager字段和员工表中的 dept 并没有实际的对等关联关系,需要在Link属性中选None。从而 manager 是实际关联字段,需要存储部门经理在员工表中记录的id。 如 Sales 部门的 manager 是 Alice,id 为 E2001, 于是 Sales 的 manager 字段存储 E2001。

人员列表: 当设置员工的部门为礼部时,礼部的部门信息显示了所有员工

dept-form-zh

部门详细信息:

dept-form-zh