# 表单开发进阶
# 编码基础
# formData简介
1.formData是表单绑定实体的对象,包含实体中所有的元素;当实体存在强/弱关联关系时,formData中也会存在另一个关联实体的对象或是数组对象。
2.formData是表单提交时对象,在视图新增、修改、流程表单提交时都会将formData上传至后端接口。
3.表单内的组件字段元素都存放在formData中,表单设计器的js编辑器中都可使用this.formData.XXX(组件字段)拿到当前组件的值完成一系列场景实现。例如:
组件赋予默认值:
业务规则中实现金额计算:
表单提交前事件进行组件赋值
# 强关联对象
强关联对象指实体之间通过关联字段连线建立关联关系,实体模型中建立1:n、n:1、双向1:n模型关系后,可在表单与视图中体现出来。
如上图所示:ITeacher与IStudent建立双向一对n强关联关系,建立持久化实体ITeacher、IStudent的表单,在ITeacher表单中拖进子表格控件,绑定IStudent的视图,即可在ITeacher表单中添加IStudent实体数据,通过关联关系将数据提交至数据库。
同时在IStudent实体中每条数据都会加载Iteacher的关联实体,在IStudent的视图中,可以添加绑定Iteacher的列字段,如下图为教师名称绑定列名ITeacher.name字段,这样每条IStudent数据都可以展示关联的ITeacher信息。
当Iteacher中的数据删除时,IStudent中绑定的关联关系数据也会同步删除。
# 弱关联对象
弱关联对象指实体之间没有建立连线关联关系,实现在一个实体表单内引用另一个数据实体的数据。
如下图场景所示:
采购明细实体与产品价目实体是两个没有关联关系的实体,采购明细表单中产品名称下拉框只需绑定产品价目数据实体,便可将产品价目表中的数据引入到该下拉框中。
同时在当前表单生成一个系统对象__productNameObject
,可为单价和单位组件设置默认值,该默认值就为这个系统对象中的单价和单位字段值。
当选择产品名称后,该产品的单价和单位也会随之匹配显示在表单页面上,实现联动效果。
# 系统对象
系统对象指当前表单内所生成的系统已有对象。例如当引入选人组件并绑定数据实体字段后,会生成人员Object实体,该实体中含有人员详细信息字段,以供后续赋值使用。机构组件、上传组件等在绑定完实体字段后都可生成系统对象
此外,下拉选择组件绑定数据实体字段后,为它的数据来源绑定数据实体,也可生成系统对象。生成的系统对象可用this.formData.系统对象名
拿到该对象数据。
# 获取组件对象
获取组件对象信息可通过Api this.Api.getElement('fieldName')
来实现。
如下场景所示。获取到选择类型的组件对象,可以设置其options值或是遍历操作options值;
//为单选框options赋值
this.Api.getElement('operateType').setOptions(this.options);
//遍历选择组件operateType的选择值内容,当选择组件operateType值不为open时,把其选择值都设为禁用
this.Api.getElement('operateType').options.forEach(item => {
if (this.formData.operateType !== 'open') item.disabled = true
})
# 控制组件的隐藏显示
1.绑定实体和字段的控件使用示例如下:
this.Api.setVisible(false,['name','age','field_54844201']) //隐藏控件 (第二个参数是字段名数组)
this.Api.setVisible(true,['name','age','field_54844201']) //显示控件 (第二个参数是字段名数组)
2.无绑定字段的控件, 如button, tabs, html 等使用如下示例:
this.Api.hideElements(['button_83039646','html_69028416']) //隐藏控件 (参数是控件名)
this.Api.showElements(['button_83039646','html_69028416']) //显示控件 (参数是控件名)
3.也可使用布局组件标签页进行控制标签页内的组件的显示与隐藏,输入显示条件,即可根据返回值true/false来进行组件的显示与隐藏。
# 设置选择类组件的选择范围
这里以下拉选择组件为例,选择组件的数据来源可以选择为数据字典,数据字典可以去AFCenter的组织权限中心》通用管理》字典管理中创建字典类型与字典项,创建完成后便可在此处选择到所选数据;
选择组件的数据来源可选为数据实体,绑定已有的数据实体,控制显示字段与值字段即可选用数据实体中的数据。
选择组件的数据来源可以选择为自定义数据绑定选择组件,自定义的数据通常在表单高级设置中设置变量,变量格式固定,如下
[
{
'label':'钢笔',
'value':'pen'
},
{
'label':'尺子',
'value':'ruler'
}
]
也可在表单的js事件中使用API为选择组件设置options值,如下:
# 组件嵌套
组件嵌套通常是指在一个父表单上通过子表格嵌套另一个视图,或是使用按钮打开表单或视图弹窗等场景。
# parentFormData
例如在Iteacher的表单中放入绑定IStudent的子表格组件,在IStudent的视图中就可通过this.parentFormData
拿到作为父表单的ITeacher表单中formData的数据。如下图所示,在子表格行操作按钮中写下触发事件在控制台打印this.parentFormData
参数,即可看到ITeacher的formData数据展示在控制台中。
# opener
上诉场景,在IStudent的视图中可通过按钮触发事件拿到this.opener
内的参数,this.opener
指的是拿到父表单内所有元素信息,包括formData,事件函数,API,组件元素等信息;
如若ITeacher表单嵌套在其他表单中,可以在IStudent中写成this.opener.opener
,拿到Iteacher表单的父表单的页面元素信息,多层嵌套关系,以此内推。
此外,也可在当前表单中通过this.opener
拿到当前表单的视图内的所有元素信息;如下图所示:
# 使用弹出窗口进行参数传递
表单或视图按钮上可绑定弹出窗口事件,在打开弹窗中可进行参数传递。
上图为代码块打开弹窗传参,也可使用配置化打开弹窗。
传递的参数formData_name
需要在打开的表单或视图的高级设置中添加外部参数formData_name
;
定义完参数后就可以使用this.formData_name
拿到父表单/视图中传递的参数。
# 使用页面容器
表单编辑器下,高级组件中可使用页面容器组件,该组件可绑定表单资源或视图资源,绑定成功后,即可在当前页面展示出所绑定的表单或视图。
示例场景一:学生信息表单页面使用页面容器绑定教师信息表单资源,在查看学生详细信息时展示出该名学生班主任的信息(注:此时,教师与学生的实体模型关系为双向1:n,为页面容器绑定教师实体字段即可);
示例场景二:页面容器绑定视图,在表单中显示视图查询数据,可把页面容器嵌套入标签页,通过切换标签页达到查看不同的页面容器绑定视图所查询的数据。
该场景实现需要编写js脚本来实现,详细步骤如下:
1.新增教师视图为女教师视图,将默认教师视图作为男教师视图,在男教师视图中找到视图设置=》高级设置=》新增视图查询前事件,编写视图默认查询条件根据性别值为男来查询数据的js代码如下:
同上在女教师视图中创建视图查询前事件,将默认查询条件值改为女即可;
2.在主表单中拖进两个页面容器组件与一个标签页组件,两个页面容器分别绑定刚刚创建的男教师视图与女教师视图;在标签页组件基础属性中新增一个标签页,将两个标签页改名为男教师
与女教师
;分别将两个页面容器拖入对应标签页中。
3.编写视图查询js脚本。当前场景是表单加载后默认展示第一个标签页的视图数据,所以在表单高级设置中创建表单加载后事件,调用getFrame('页面容器组件编码')
方法拿到容器组件属性在调用他的doQuery
方法,达到默认加载页面查询数据的目的;
当标签页切换时也需要去查询视图数据,所以在标签页组件的高级中创建切换标签事件,当标签页切换时执行不同视图的查询事件。
综上步骤,即可实现所展示场景。