# 引用值
在动态中可以用$字段名表示其值,根据字段的数据类型不同,在动态中的引用值具有不同的javascript类型;在动态的赋值,逻辑判断等方面都需要考虑值的类型来决定动态的书写。例如,开发者不能将一个string类型的值赋值给一个Code类型的字段,也不能将File类型的值赋值给一个数值类型的字段。
# 值的类型
字段值的类型可以分为简单类型和对象类型两种,前者包括number,string,boolean等,后者根据不同的数据类型有不同的对象结构。
# 简单类型
字段类型 | 值类型 | 备注 | 相关内置函数 |
---|---|---|---|
string | string | 字符串 | concat reduce length startWith endWith left right |
XHTML | string | 富文本 | 同上 |
integer | number | 整数 | isNaN parseInt abs等数学函数 sum avg等统计函数 |
double | number | 浮点数 | isNaN parseFloat toFixed abs等数学函数 sum avg等统计函数 |
date | number | unix时间戳,1970年1月1日以来的秒数 | formatDate dateSpan |
datetime | number | unix时间戳,1970年1月1日以来的秒数 | formatDate |
time | number | 00:00:00以来的秒数 | formatTime |
boolean | boolean | 布尔 | iif |
# 对象类型
当字段的数据类型为Code、User、Organize、File、Thing、anyURI、Location时,动态中的引用值会具有对象类型,对象类型分以下几种:
# ValuePair
键值对类型,这个对象上包含value,displayValue属性,表示值和显示值。Code、User、Organize、Thing、Location都兼容ValuePair类型,即这些对象上都有value和displayValue属性
属性 | 描述 |
---|---|
value | 值 |
displayValue | 显示值 |
# Code
Code(代码)类型兼容ValuePair类型,对象中除了具有value,displayValue之外还有code和name属性
属性 | 描述 |
---|---|
value | 代码值 |
code | 代码值,与value等价 |
displayValue | 代码名称,也即显示值 |
name | 代码名称,与displayValue等价 |
相关内置函数:code
# User
User(用户)类型兼容ValuePair类型,对象中除了具有value,displayValue之外还有account和name属性,在动态中使用时推荐使用语义化更强的account和name属性
属性 | 描述 |
---|---|
value | 用户账号 |
account | 用户账号,与value等价 |
displayValue | 用户名称 |
name | 用户名称,与displayValue等价 |
相关内置函数:user
# Organize
Organize(部门)类型兼容ValuePair类型,对象中除了具有value,displayValue之外还有code和name属性,在动态中使用时推荐使用语义化更强的code和name属性
属性 | 描述 |
---|---|
value | 部门编号 |
code | 部门编号,与value等价 |
displayValue | 部门名称 |
name | 部门名称,与displayValue等价 |
相关内置函数:org
# Thing
Thing(物品)类型兼容ValuePair类型,对象中除了具有value,displayValue之外还有code和name属性,在动态中使用时推荐使用语义化更强的code和name属性
属性 | 描述 |
---|---|
value | 物品条形码(EAN-13) |
code | 物品条形码(EAN-13),与value等价 |
displayValue | 物品名称 |
name | 物品名称,与displayValue等价 |
# Location
Location(位置)类型兼容ValuePair类型,对象中除了具有value,displayValue之外还有name属性
属性 | 描述 |
---|---|
value | 定位点的值,格式是经度,维度,缩放系数 |
displayValue | 定位点名称 |
name | 定位点名称,与displayValue等价 |
# File
File(文件)类型对象结构如下表
属性 | 描述 |
---|---|
id | id |
name | 文件名 |
size | 文件大小 |
uri | 文件访问地址 |
mime | 文件类型 |
createTime | 文件创建时间,unix时间戳 |
# anyURI
anyURI对象上包含value和uri属性,它们是等价的
属性 | 描述 |
---|---|
value | URI地址 |
uri | URI地址 |
# 值的属性
User 、Organize、Code、anyURI类型上都可以带有属性,其中User、Organize类型值上的属性值是固有的,Code类型值上的属性由代码表维护,anyURI的属性是由URI路径中的参数组装的。
# 属性对象
# expando
User、Organize、Code类型的所有属性都在值对象上的expando属性里,例如有一个Code类型的值,代码值是A,显示值是选项A,这个值里有2个属性count、amount,内容分别是100、200,那么该值的内容如下
{
"value":"A",
"code":"A",
"displayValue" :"选项A",
"name":"选项A",
"expando": {
"count":"100",
"amount":"200"
}
}
2
3
4
5
6
7
8
9
10
# 引用属性
如果用户想要在动态中引用这个字段(比如fieldA)值上的属性count,那么需要使用$fieldA.expando.count,为了方便开发者,我们组装动态上下文时将expando里的属性直接搬到了值上面,那么用户就可以用$fieldA.count来引用这个属性了,实际上用户使用的这个值的内容如下
{
"value":"A",
"code":"A",
"displayValue":"选项A",
"name":"选项A",
"count":"100",
"amount":"200",
"expando": {
"count":"100",
"amount":"200"
}
}
2
3
4
5
6
7
8
9
10
11
12
# 属性冲突
当expando里的属性名称和值里的直接属性冲突时(例如,expando里也有一个叫做value的属性,值是300),此时value属性值会是原value属性值,而不会被expando里的value覆盖,此时该值的内容如下
{
"value":"A",
"code":"A",
"displayValue":"选项A",
"name":"选项A",
"count":"100",
"amount":"200",
"expando": {
"count":"100",
"amount":"200",
"value":"300"
}
}
2
3
4
5
6
7
8
9
10
11
12
13
但是以上冲突处理规则并不适用于anyURI类型的属性,也就是当uri路径中有一个value参数或者uri参数时,也会将其值搬到URI对象属性value或者uri上,这么做的原因是路径上的参数往往是动态关心的内容,而uri本身并不是非常重要。
# User
User类型的值对象上有着丰富的属性供表单动态使用,下表中类型带有(⤶)的说明多个值之间用\n(回车)分隔,类型带有[]的说明多个值以数组形式存放,注意下表中的Organize类型对象都是通过expando里相关属性直接组装到User上的,expando里是找不到这些Organize类型数据的,expando里都是string类型的原始数据。
属性名称 | 类型 | 描述 |
---|---|---|
userCode | string | 学工号(所有三元组中索引最高的) |
userCodes | string(⤶) | 学工号列表(所有三元组) |
userCodesFiltered | string(⤶) | 学工号列表(UserFilters过滤后的三元组) |
organizeCode | string | 所在部门代码(所有三元组中索引最高的) |
organizeName | string | 所在部门名称(与organizeCode对应) |
organize | Organize[] | 所在部门列表(所有三元组) |
organizeFiltered | Organize[] | 所在部门列表(UserFilters过滤后的三元组) |
indepOrganize | Organize[] | 所在独立部门/列表(所有三元组中索引最高的) |
indepOrganizeFiltered | Organize[] | 所在独立部门/列表(UserFilter过滤后的三元组) |
positions | string(⤶) | 用户完整三元组,UserFilters格式 |
formalPositions | string(⤶) | 用户身份三元组,UserFilters格式 |
title | string | 称谓,由用户的身份以及职务决定 |
# Organize
Organize类型的值上只有独立部门代码和独立部门名称两个属性。
属性名称 | 类型 | 描述 |
---|---|---|
indepOrganize_Code | string | 独立部门代码 |
indepOrganize_Name | string | 独立部门名称 |
# Code
Code类型值的属性,如果是内部代码表由代码表维护,请参见此处;如果是外部代码表请在Messenger里组装代码表时自行组装属性。
# anyURI
anyURI类型值的属性是由URI路径中的参数以及hash#值组装的,如果路径参数和hash冲突,采用hash中的内容。例如路径为https://www.sjtu.edu.cn/query?param1=a¶m2=b#param2=2¶m3=3的值属性如下:
{
"value":"https://www.sjtu.edu.cn/query?param1=a¶m2=b",
"uri":"https://www.sjtu.edu.cn/query?param1=a¶m2=b",
"param1":"a",
"param2":"2",
"param3":"3",
"expando":{
"param1":"a",
"param2":"2",
"param3":"3"
}
}
2
3
4
5
6
7
8
9
10
11
12
13