# 触发时机
# 触发时机
在以下情况下动态会被触发。
# 表单初始化
表单初始化时候除了公式以外的所有动态设置都会触发,公式不会触发(字段的初始值总是从后端数据库中获取,前端对其不影响)。除非这个控件在重复节表中因为MinOccur设置了值而新增出来的行里,这种情况下动态公式才会在表单初始化时候执行。
# 字段变化
动态的触发多数由表单上字段内容的变化而引起,只要这个动态设置所涉及到的控件的值发生变化,那么这个动态就会被触发。
注意字段变化触发动态执行的时机也因控件而异,像单行文本框或者多行文本框这种需要编辑的控件在内容改变且控件失去焦点后触发动态,像下拉框、Suggester、Option、Check这种用户的选中或者点击就改变其值的控件在其值改变时立即触发,不用失去焦点。
另外需要注意的是,字段如果是Code类型,其代码值发生改变才会触发动态,如果是显示值发生变化而代码值不变是不会触发动态的。
# 重复节表变动
重复节表的变动包括新增、删除、行改序(菜单上点上下移或者重复表表头排序),以下分情况说明都会触发哪些动态
# 新增
A. 该新增行上所有控件执行所有的动态样式、公式、动作、脚本
B. 如果外层(重复节表所在层级及所有父级)控件(包括重复节表自身)的动态依赖于行中的控件或者重复节表控件,那么将会触发这些动态
C. 如果新增的行引起了其他行序号的变化,那么其他行上依赖于$INDEX的动态将会执行
D. 重复节表上设置的ItemStyle、ItemVisible、ItemReadOnly三个动态将会执行
# 删除
A. 如果外层(重复节表所在层级及所有父级)控件(包括重复节表自身)的动态依赖于行中的控件或者重复节表控件,那么将会触发这些动态
B. 如果删除的行引起了其他行序号的变化,那么其他行上依赖于$INDEX的动态将会执行
C. 重复节表上设置的ItemStyle、ItemVisible、ItemReadOnly三个动态将会执行
# 行改序
A. 如果外层(重复节表所在层级及所有父级)控件(包括重复节表自身)的动态依赖于行中的控件或者重复节表控件,那么将会触发这些动态
B. 改变序号的行内的控件将会触发依赖于$INDEX的动态
C. 重复节表上设置的ItemStyle、ItemVisible、ItemReadOnly三个动态将会执行
# 字段控件失去焦点
字段控件失去焦点时会触发动态验证,即使这个控件内容没有改变。
# 表单提交
表单提交时会触发动态验证。
# FieldChange
fieldChange返回数据后,如果返回的数据有变化,那么触发动态。但对于公式来说,如果公式的计算值和fieldChange返回的值有冲突,那么以fieldChange返回的值为准。
# 自定义全局变量变化
在根对象上全局初始化脚本中可以自定义全局变量,当这些自定义变量的值发生了改变时就会触发依赖的动态。
# 汇总
可将以上触发时机的描述汇总成以下表格
触发时机\动态 | 动态公式 | 动态样式 | 动态动作 | 动态验证 | 动态脚本 |
---|---|---|---|---|---|
字段变化(注) | Y(注) | Y | Y | Y | Y |
表单初始化 | N | Y | Y | N | Y |
重复节表变动 | Y | Y | Y | Y | Y |
表单提交 | N | N | N | Y | N |
控件失去焦点 | N | N | N | Y | N |
FieldChange | Y(注) | Y | Y | Y | Y |
自定义全局变量变化 | Y | Y | Y | Y | Y |
备注
- 字段变化触发动态因控件而异,单行和多行文本框内容由用户输入而改变后需要失去焦点才会触发动态,Select、Suggester、Option、Check等控件用户点选后即刻触发动态
- 表单初始化时动态公式是不执行的,除非这个控件在重复节表中因为MinOccur设置了值而新增出来的行里,这种情况下动态公式才会在表单初始化时候执行
- FieldChange改变表单字段数据后会触发所有动态,但是如果FieldChange事件中有返回值,那么就会忽略触发动态公式后的计算值,采用事件中传回的数据作为表单字段数据,即FieldChange传回的值优先于动态公式计算值
# 联动触发
当一个字段的动态公式或者一个会影响到该字段值的动态动作触发后,如果这个字段还影响到其它字段,那么该动态公式和动态动作执行完后将再次触发设置在其它字段上的动态,这被称为联动触发。
# 联动触发的循环问题
当动态公式的触发形成一个环路时,表单会阻止公式无限循环执行。例如有循环公式A->B->C->A,那么当A首先发生改变时,公式会触发两次,执行A->B->C,而C->A这次动态公式会被忽略;如果C首先发生改变,公式会执行C->A->B,而B->C则被忽略。