自定义JS事件开发指南(旧版)|飞书低代码平台 - 飞书官网
产品功能

自定义JS事件开发指南(旧版)|飞书低代码平台

飞书

2024-12-23

功能简介​
适用场景​
表单与页面组件暴露出的事件​
全局工具对象API​
全局工具对象API详细说明​
Web端调试​
功能简介​
自定义 JS 事件动作支持开发者为表单、页面中的事件(如表单提交事件、页面加载事件、数据表格点击行事件等)绑定「自定义 JS 代码」,当事件发生时,执行特定的自定义 JS 代码。​
表单中的自定义 JS 事件​
​
250px|700px|reset
​
​
页面中的自定义 JS 事件​
​
250px|700px|reset
​
​
适用场景​
表单项自定义校验​
  • 需求:在数字表单项中,写入的数值超过 100 后报错​
  • 代码实现如下:​
​
//清除各组件的error提示​
context.event.currentComponent.clearError();​
//获取表单内容并进行判断​
const value = context.event.currentTarget.value;​
if (value && value > 100) {​
context.event.currentTarget.setError("数字不能超过100!")​
} else {​
context.event.currentTarget.setError(null);​
}​
​
  • 效果图:​
​
250px|700px|reset
​
​
页面事件刷新表格数据​
  • 需求:通过页面事件刷新表格数据​
  • 代码实现如下:​
​
// 按钮的自定义事件实现如下:​
​
const newUniqueID = `${Date.now()}`;​
// 设置页面变量后,所有依赖此页面变量的组件会刷新​
context.page.setPageVar('var_15dpf9k', newUniqueID);​
​
  • 表格组件的过滤条件配置如下:​
​
250px|700px|reset
​
​
  • 效果图:​
​
250px|700px|reset
​
​
表单与页面组件暴露出的事件​
在表单和不同的页面组件中,会暴露不同的的事件。​
表单​
​
元素​
目前支持的事件​
表单​
  • 表单打开时:表单加载完成之前触发​
  • 表单提交时:点击「提交」按钮后,表单数据提交到服务器之前触发(当前表单中有报错的组件时,将不能触发)​
表单中的字段组件​
​
  • 获得焦点时:字段组件获得焦点时触发​
  • 失去焦点时:字段组件失去焦点时触发​
  • 值改变时:字段组件中的值发生改变时触发​
  • 默认有 500 ms 的防抖: 500 ms 内,最多执行一次「值改变时」事件​
  • 公式造成的字段值改变,不会触发该字段的 onChange 事件​
表单中的明细组件​
  • 单元格获取焦点时:组件中任何一个单元格的输入框获取焦点时触发​
  • 单元格失去焦点时:组件中任何一个单元格的输入框失去焦点时触发​
  • 单元格值改变时:组件中任何一个单元格的值发生改变时触发​
  • 默认有 500 ms 的防抖: 500 ms 内,最多执行一次「值改变时」事件​
  • 公式造成的字段值改变,不会触发该字段的 onChange 事件​
  • 添加行:组件中增加了行​
  • 删除行:组件中删除了行​
添加行和删除行不会触发「单元格值改变时」事件,只会触发添加行和删除行的事件​
​
页面​
目前仅 Web 端页面组件支持自定义事件,移动端页面组件暂未支持。​
​
元素​
目前支持的事件​
应用页面​
​
  • 页面加载完成时:当整个窗口页面完成加载时触发​
  • 页面即将关闭时:当整个窗口页面即将被关闭或刷新前触发,此时页面仍然可见​
应用页面 - 侧导航链接​
  • 点击时:当链接被点击时触发​
应用页面 - Logo​
  • 点击时:当 Logo 被点击时​
图片​
  • 点击时:当图片被点击时触发​
宫格项 - 宫格卡片​
  • 点击时​
数据表格​
  • 点击行时​
数据表格 - 列​
  • 点击时(可配置「可点击」的字段类型具有该事件):该列下的数据被点击时触发​
数据表格 - 顶部按钮 / 行按钮​
  • 点击时:当按钮被点击时触发​
记录详情 - 字段​
  • 点击时 (可配置「可点击」的字段类型具有该事件):该字段的值被点击时触发​
记录详情 - 按钮​
  • 点击时:当按钮被点击时触发​
记录标题栏 - 按钮​
  • 点击时:当按钮被点击时触发​
通用标题栏 - 按钮​
  • 点击时:当按钮被点击时触发​
列表 - 列表项标题 / 副标题 / 详情​
  • 点击时(可配置「可点击」的字段类型具有该事件):该字段的值被点击时触发​
列表 - 按钮 / 列表项按钮​
  • 点击时:当按钮被点击时触发​
列表详情 - 列表操作​
  • 点击时:当操作按钮被点击时触发​
​
全局工具对象 API​
在自定义表单事件和自定义页面事件中,提供了两个全局工具对象模块:kunlun 、context​
kunlun: 可通过此对象模块实现数据请求,获取全局变量等。​
context: 上下文对象,可通过此对象获取上下文相关变量的信息。​
​
250px|700px|reset
image.png
​
​
​
API​
​
解释​
表单事件是否有此 API​
页面事件是否有此 API​
context​
tenant​
获取当前租户信息​
✅​
✅​
​
app​
获取当前应用信息​
✅​
✅​
​
currentUser​
获取当前用户信息​
✅​
✅​
​
scene​
获取当前自定义代码的运行场景​
✅​
✅​
​
event​
获取当前事件信息,如事件类型、事件相关数据、事件触发时间等​
✅​
✅​
​
form​
获取当前表单信息, 设置表单项的值/属性/错误信息等​
✅​
❌​
​
page​
获取当前页面信息, 设置页面变量等​
❌​
✅​
kunlun​
dataService​
发起【数据请求】​
✅​
✅​
​
getVar​
获取【全局变量】​
✅​
✅​
​
全局工具对象 API 详细说明​
context.tenant​
获取当前租户的基本信息​
返回示例:​
​
​
{​
"id": 123,​
"name": "hotpot",​
"type": 1, //1-PROD,3-DEVORG,4-SANDBOX​
"createdAt": 166012345678​
}​
​
context.currentUser​
获取当前用户的基本信息​
返回示例:​
​
​
{​
"_id": 1661915892174855,​
"_name": {​
"zh_CN": "张三",​
"en_US": "Zhang San"​
}​
}​
​
context.app​
获取运行时应用的基本信息​
  1. 返回示例:​
​
​
{​
"namespace": "event__c",​
"label": {​
"zh_CN": "自定义事件测试-Web",​
"en_US": "Test For Event"​
},​
"createdAt": 1619594598302,​
"createdBy": {​
"id": 1698264932790343,​
"name": "张三"​
},​
"updatedAt": 1619767318591,​
"updatedBy": {​
"id": 1698266222693390,​
"name": "张三"​
}​
}​
​
context.event​
获取当前事件的信息 ​
返回示例​
  • 获取触发当前事件的组件信息context.event.currentTarget​
  • 明细组件的事件中​
  • 单元格获得焦点、单元格失去焦点、单元格值改变 的.currentTarget是 Cell 的实例​
  • 添加行 和 删除行的事件 .currentTarget 是 Row 的实例​
context.event.payload​
事件触发时携带的数据​
​
页面 or 表单​
事件​
Payload​
页面​
页面加载时​
​
仅「详情记录页」具有(「标准页面」为空)​
{ ​
"recordId": 1650000000​
}​
页面​
  • 数据表格组件:点击行时 / 点击行按钮时​
  • 记录标题栏组件:点击按钮时​
  • 记录详情组件:点击标题区按钮时​
  • 列表组件:点击列表项按钮时​
{ ​
"record": { "_id":1650000000, ... }​
}​
页面​
  • 数据表格组件:点击列 / 字段值时​
​
{ ​
"position": {​
"field": "fieldApiName",​
"recordId": 1650000000​
},​
"value": "示例数据" // 数据格式由字段类型决定​
}​
页面​
  • 下拉选择组件:值改变时​
// 数据类型为「对象记录」时​
{ ​
"dataType": "record",​
"oldValue": 1650000000,​
"newValue": 1650000000​
}​
// 数据类型为「选项」时​
{​
"dataType": "option",​
"oldValue": "optionA",​
"newValue": "optionB"​
}​
表单​
加载时 / 提交时​
获取焦点时 / 失去焦点时 / 值改变时​
​
只有「需要基于已有记录发起」的操作的表单,会有 payload 信息​
{​
"recordId": 1717935764901981​
}​
​
kunlun.getVar​
获取应用中的全局变量的值:可以在代码中使用 kunlun.getVar("key") 获取​
  • 获取全局变量​
​
​
const _var = await kunlun.getVar("key")​
​
  • 创建、修改、删除全局变量​
​
250px|700px|reset
image.png
​
​
​
kunlun.dataService​
context.form​
注意:此属性是表单事件特有的​
获取当前表单信息​
  • 返回示例:​
​
​
{​
"title": {​
"zh_CN": "添加成员",​
"en_US": "Add member"​
},​
"components": [​
{​
"id": "name_input_component", //组件的 ID​
"alias": {​
"zh_CN": "姓名",​
"en_US": "Name"​
},​
"placeholder": {​
"zh_CN": "请输入姓名",​
"en_US": "Please enter name"​
},​
"tooltip": {​
"zh_CN": "请输入姓名",​
"en_US": "Please enter name"​
},​
"hidden": false,​
"readonly": false,​
"required": true,​
"type": "text",​
"value": "一段文本"​
},​
{​
"id": "gender_option_component",​
"alias": {​
"zh_CN": "性别",​
"en_US": "Gender"​
},​
"placeholder": {​
"zh_CN": "请输入性别",​
"en_US": "Please enter gender"​
},​
"tooltip": null,​
"hidden": false,​
"readonly": false,​
"required": true,​
"type": "option",​
"optionList": [ //下拉选项列表,仅选项类型组件有​
{​
"apiName": "option1",​
"label": {​
"zh_CN": "选项1",​
"en_US": "Option1"​
}​
},​
{​
"apiName": "option2",​
"label": {​
"zh_CN": "选项2",​
"en_US": "Option2"​
}​
},​
{​
"apiName": "option3",​
"label": {​
"zh_CN": "选项3",​
"en_US": "Option3"​
}​
}​
],​
"value": [​
"option_1"​
]​
},​
{···},​
{···},​
{···}​
]​
}​
​
context.form.getComponentById​
  • 获取当前表单中指定 id 的字段组件的实例 _componentRef​
​
​
const _componentRef = context.form.getComponentById("name_input")​
​
​
  • 组件 ID 在组件的属性面板中可看到 ⬇️​
​
250px|700px|reset
image.png
​
​
​
普通字段组件​
  • 返回:​
​
​
{​
"id": "name_input",​
"alias": {​
"zh_CN": "姓名",​
"en_US": "Name"​
},​
"placeholder": {​
"zh_CN": "请输入姓名",​
"en_US": "Please enter name"​
},​
"tooltip": {​
"zh_CN": "这是一段 Tooltip",​
"en_US": "This "​
},​
"hidden": false,​
"readonly": false,​
"required": true,​
"type": "text",​
"value": "一段文本"​
}​
​
​
明细组件​
明细组件与普通的字段组件不同,除了组件的基本信息,还会返回组件中的 rows 和 columns​
  • 返回:​
​
获取明细组件信息 ​
  • .getComponentById()​
  • 入参:​
  • componentId​
​
context.form.getComponentById("detail_1")​
{​
"id": "details_1", // 组件的 ID。每个拖入表单中的明细组件均自动生成 id​
"type": "details", // 类型​
"alias": { // 名称​
"zh_CN": "表单明细组件",​
"en_US": "Name"​
},​
"placeholder": {​
"zh_CN": "请输入表单明细组件",​
"en_US": "Please enter name"​
},​
"tooltip": {​
"zh_CN": "请输入表单明细组件",​
"en_US": "Please enter name"​
},​
"hidden": false,​
"required": true, ​
"allowAdd": true, ​
"rows": [​
{ ​
"value": { // 第 1 条记录,index = 0​
"_id": 212121212122121221, // ID 字段值,只有来源是「来自数据库」的记录有值​
"fieldApiName1": "value", // 第 1 条记录的第一个字段值​
"fieldApiName2": "value"​
},​
"setValue":f(), // 方法​
"getCell":f()​
},​
{···},​
···​
{···} // 第 index+1 条记录​
],​
"columns": [​
{​
"apiName":"fieldApiName1", //展示字段的 API Name​
"alias": {​
"zh_CN": "书名",​
"en_US": "Name"​
},​
"placeholder": {​
"zh_CN": "请输入书名",​
"en_US": "Please enter name"​
},​
"tooltip": {​
"zh_CN": "请输入书名",​
"en_US": "Please enter name"​
},​
"hidden": false,​
"readonly": false,​
"required": true,​
"type": "text",​
"value": [ // 本列字段值,数组中每项代表每个单元格的值​
"小王子",​
"活着",​
"平凡的世界",​
"百名孤独"​
],​
"setValue":f(),​
"setError":f(),​
"clearError":f(),​
"setProps":f(),​
"getCell":f()​
},​
···​
{···} // 列的实例​
],​
"value": [​
{​
"_id": 212121212122121221, // ID 字段值,只有来源是「来自数据库」的记录有值​
"fieldApiName1": "value",​
"fieldApiName2": "value"​
},​
{​
"_id": null,​
"fieldApiName1": "value",​
"fieldApiName2": "value"​
},​
{···}​
]​
}​
在明细组件中下钻到指定字段的列​
​
_componentRef.columns.find(x => x.apiName === 'fieldApiName1')​
{​
"apiName":"fieldApiName1", //展示字段的 API Name​
"alias": {​
"zh_CN": "书名",​
"en_US": "Name"​
},​
"placeholder": {​
"zh_CN": "请输入书名",​
"en_US": "Please enter name"​
},​
"tooltip": {​
"zh_CN": "请输入书名",​
"en_US": "Please enter name"​
},​
"hidden": false,​
"readonly": false,​
"required": true,​
"type": "text",​
"value": [ // 本列字段值,数组中每项代表每个单元格的值​
"小王子",​
"活着",​
"平凡的世界",​
"百名孤独"​
]​
}​
在明细组件中下钻到指定 index 的行​
​
_componentRef.rows[1]​
{ ​
"value": {​
"_id": null, ​
"fieldApiName1": "value",​
"fieldApiName2": "value"​
}​
}​
获取明细组件中指定单元格 .getCell()​
  • 入参:​
  • fieldApiName​
  • index​
​
在不同的层级获取指定单元格​
  • _componentRef.getCell("phoneNumber", 1)​
  • _componentRef.columns.find(x => x.apiName === 'fieldApiName1').getCell(1)​
  • _componentRef.rows[1].getCell("phoneNumber")​
返回示例:​
{​
"index":1, // 单元格所在行的 index(index 从 0 开始计数)​
"apiName":"phoneNmuber", // 单元格所在列的展示字段 apiName​
"value": {"key":"+86","number":11312121,"code":"+86(CN)"}, //不同的字段值 value 不同​
}​
​
_componentRef.setValue()​
修改组件中的值​
  • 不传任何参数或传空值时,将把组件中的值清空​
  • 只读的字段,setValue 不会生效​
​
语法示例​
效果​
const _componentRef = context.event.currentComponent;​
_componentRef.setValue({​
"zh_CN": "这里是修改后的值",​
"en_US": "english"​
})​
​
​
250px|700px|reset
​
​
​
​
​
字段组件​
​
​
字段组件类型​
参数值类型​
示例 (const _componentRef = context.event.currentComponent;)​
文本​
string​
_componentRef.setValue("文本")​
Auto ID​
string​
_componentRef.setValue("N000001")​
数字​
number​
_componentRef.setValue(12345678)​
布尔​
boolean​
_componentRef.setValue(true)​
邮箱​
string​
需是邮箱格式,否则组件会报错​
_componentRef.setValue("test@test.com")​
选项​
string,值为选项 api name​
api name 不存在时,更新不成功,且 console 会报错​
_componentRef.setValue("optionApiName")​
多选类型通过数组赋值​
关联对象​
int 或 string 都兼容,值为记录 id​
id 不存在或无该记录权限时,更新不成功,且 console 会报错​
_componentRef.setValue(1700648125701303)​
多选类型通过数组赋值​
多语类型​
object​
​
_componentRef.setValue({​
"zh_CN": '你好',​
"en_US": 'english'​
})​
​
// 只设置单一语种​
_componentRef.setValue({​
"zh_CN": '你好'​
})​
日期​
string​
_componentRef.setValue("2020-01-01");​
​
日期时间​
int 时间戳​
_componentRef.setValue(1577836800000);​
​
电话​
object 或 string​
//方式一,传入对象(获取手机号后直接赋值的场景)​
_componentRef.setValue(​
{​
"key": "+86(CN)",​
"code": "+86",​
"number": "13802345678"​
})​
​
//方式二,只传入「number」的文本,默认是 +86,不传区号和国家码,则默认是 "+86" 和 "CN"​
_componentRef.setValue("13802345678")​
组合类型字段​
list<object>​
object 是一条组合类型 record,Key 是字段 api name​
_componentRef.setValue([{​
"company": "字节跳动",​
"Job_level": "P1",​
"job": "PM",​
"start_date": "2010-01-01"​
"end_date": "2020-01-01"​
},{​
"company": "五道口跳动",​
"Job_level": "P0",​
"job": "PM",​
"start_date": "2001-01-01"​
"end_date": "2010-01-01"​
}])​
文件​
  • 单文件字段:object​
  • 多文件字段:list<object>​
object 是一条组合类型 record,Key 是字段 api name​
​
可以在函数中使用 upload 的接口,上传文件后获得文件 token​
// 单文件​
_componentRef.setValue({​
id: 'a4879a6d2e8e43b98781ba6f5b261071',​
mime_type: 'jpg',​
name: '328648-14011213253758.jpg',​
size: 143592,​
token: '57b70c0acf244e62887a2dcf9bf938c1'​
})​
​
// 多文件​
_componentRef.setValue([{​
id: 'a4879a6d2e8e43b98781ba6f5b261071',​
mime_type: 'jpg',​
name: '328648-14011213253758.jpg',​
size: 143592,​
token: '57b70c0acf244e62887a2dcf9bf938c1'​
},​
{​
id: 'a4879a6d2e8e43b98781ba6f5b261071',​
mime_type: 'jpg',​
name: '328648-14011213253758.jpg',​
size: 143592,​
token: '57b70c0acf244e62887a2dcf9bf938c1'​
}])​
头像​
object​
其中 image.large 是图片的 preview URL,可以通过「上传图片」的 Open API 或者 前端 SDK 上传图片​
​
​
​
_componentRef.setValue({​
"image":{​
// 图片 preview url​
},​
//固定值​
"source": "image"​
})​
​
明细组件​
  • 可更新组件、行、列、单元格的值​
  • 明细组件中不同字段的值类型,与表单中的字段组件值类型相同​
  • 只读的字段,setValue 不会生效​
​
功能​
示例​
更新行的值 _row.setValue()​
  • 入参​
  • map​
  • map 中的 key 是字段 API Name​
  • 不同类型的字段,参数值格式与表单中的字段组件一致,具体可见字段组件​
​
const _componentRef = context.form.getComponentById("detail_1")​
const _row = _componentRef.rows[2]​
const row2Value = {​
"_name":"李四",​
"type":"option_345663",​
"lookupUser":1700648125712345​
}​
_row.setValue(row2Value)​
更新列的值 _row.setValue()​
  • 入参​
  • array​
  • map 中的 key 是字段 API Name​
  • 不同类型的字段,参数值格式与表单中的字段组件一致,具体可见字段组件​
const _componentRef = context.form.getComponentById("detail_1")​
const _col = _componentRef.columns.find(x => x.apiName === 'fieldApiName1')​
const colValue = ["option_345663","option_345663","option_345663"]​
_col.setValue(colValue)​
更新指定单元格的值 _cell.setValue()​
  • 入参​
  • 该单元格的字段值​
  • 不同类型的字段,参数值格式与表单中的字段组件一致,具体可见字段组件​
​
const _componentRef = await context.form.getComponentById("detail_1")​
const _cell = _componentRef.getCell("type",2)​
​
_cell.setValue("option_345663")​
更新组件的值 _componentRef.setValue(componentValue)​
  • 传入一个完整的 table,完全覆盖更新明细组件中的值​
  • 入参​
  • 由 map 组成的数组​
  • 数组长度是明细组件的行数​
  • map 的 key 是展示字段的 API Name​
  • 如果 key 对应的字段是只读的,则更新不成功​
​
不建议使用此方式。此方式可能会非常影响性能​
建议按行、按列、按单元格更新值​
​
const _componentRef = context.form.getComponentById("detail_1")​
const tableValue = [​
{​
"_name":"张三",​
"type":"option_121211",​
"lookupUser":1700648125701303 //更新 lookup 字段。不同字段的值结构见附录​
},​
{​
"_name":"李四",​
"type":"option_345663",​
"lookupUser":1700648125712345​
},​
{​
"_name":"王二",​
"type":"option_789987",​
"lookupUser":1700648125745678​
},​
]​
_componentRef.setValue(tableValue)​
​
​
​
_componentRef.setProps​
修改组件的属性, 支持传入不同的参数修改组件的不同属性,如 alias、hidden 等​
支持的参数有: ​
​
参数​
参数类型​
对应的组件属性​
示例​
title​
String​
表单的标题​
修改表单的标题​
context.form.setProps({"title": "新标题"});​
alias​
object​
​
别名 / Alias​
​
修改组件的 Alias、Placeholder、tooltip​
代码:​
_componentRef.setProps({​
"alias": {​
"zh_CN":"这是修改后的别名",​
"en_US":"alias"​
},​
"placeholder": {​
"zh_CN":"这是修改后的占位符",​
"en_US":"placeholder"​
},​
"tooltip": {​
"zh_CN":"这是修改后的tooltips",​
"en_US":"tooltip"​
}​
})​
效果:​
​
250px|700px|reset
​
​
​
placeholder​
object​
占位符 / Placeholder​
​
tooltip​
object​
提示 / Tooltip​
​
text​
object​
文字说明 / Description​
模块标题 / Section title​
提示 / Notification​
修改 文字说明、模块标题、提示组件的文本内容​
const _notificationComponent = context.form.getComponentById("notification_1")​
_notificationComponent.setProps({​
"text": {​
"zh_CN":"这是修改后的提示",​
"en_US":"Notification"​
}​
})​
效果:​
​
250px|700px|reset
​
​
​
hidden​
Boolean​
隐藏 / Hidden​
仅对「展示元素」类型的组件有效​
// 设置 display element 组件隐藏​
const _displayComp = context.form.getComponentById("description_1")​
​
// 方式一,使用 setProps()​
_displayComp.setProps({hidden:true}); //隐藏​
_displayComp.setProps({hidden:false}); //显示​
​
//方式二,使用 hide() / show() 方法​
_displayComp.hide(); //隐藏​
_displayComp.show(); //显示​
minDate​
maxDate ​
​
Date​
日期可选范围​
仅日期组件有效​
​
设置日期和日期时间可选范围​
_componentRef.setProps({​
"minDate": "2020-03-11",​
"maxDate": "2020-03-21"​
})​
​
250px|700px|reset
​
​
​
minDateTime​
maxDateTime​
​
DateTime 时间戳​
​
日期时间可选范围​
仅日期时间组件有效​
​
_componentRef.setProps({​
"minDateTime": 1577836800000,​
"maxDateTime": 1577836800000​
})​
​
_componentRef.setError() / _componentRef.clearError()​
设置 / 清除表单项的报错信息​
TIP: 当表单中有任何报错时,不会触发表单的 onSubmit 事件。对组件使用.setError()如果没有使用.clearError(),该组件将一直报错(表单将一直无法提交)​
字段组件​
​
功能​
示例​
.setError(),设置组件报错​
  • 参数是多语类型的 Error Message​
//设置组件报错​
//设置多语的 error message​
_componentRef.setError({​
"zh_CN": "这是自定义的 error message",​
"en_US": "english"​
})​
​
//设置单语的 error message​
_componentRef.setError("这是自定义的 error message")​
​
250px|700px|reset
​
​
​
.clearError(),清除组件的报错状态和样式​
  • 无需传参​
//取消组件报错​
_componentRef.clearError()​
​
​
明细组件​
明细组件报错分为:组件报错、列报错、单元格报错​
​
功能​
示例​
设置报错.setError()​
  • 入参​
  • 多语类型的 Error Message​
  • 组件级报错​
  • context.form.getComponentById("detail_1").setError()​
const _componentRef = await context.form.getComponentById("detail_1")​
const _column = _componentRef.columns.find(x => x.apiName === 'type')​
const _cell = _column.getCell(2)​
​
const errorMsg = {​
"zh_CN": "报错文案占位符",​
"en_US": "Show Error"​
}​
​
// 组件级报错​
_componentRef.setError(errorMsg)​
// 列级报错​
_column.setError(errorMsg)​
// 单元格级报错​
_cell.setError(errorMsg)​
​
250px|700px|reset
​
​
250px|700px|reset
​
​
250px|700px|reset
​
​
​
​
清除报错.clearError()​
  • 无需入参​
// 清除组件级报错​
_componentRef.clearError()​
// 清除列级报错​
_column.clearError()​
// 清除单元格级报错​
_cell.clearError()​
​
_componentRef.addRow()​
明细组件特有,在明细组件上添加行​
  • 包含了:添加行 & 给该行赋值的动作​
  • 添加行后,会触发明细组件的「添加行」事件​
  • 入参:由 map 组成的数组​
  • 如果不传参数,则只增加一个空行​
  • 出参:添加了该行后的整个组件实例​
  • 可继续链式调用​
​
​
const rowValue = {​
"_name": "李四",​
"type": "option_345663",​
"lookupUser": 1700648125712345​
}​
const _newCopmpnent = _componentRef.addRow(rowValue)​
​
//链式调用举例​
_newCopmpnent.getCell("type",2).setError(errorMsg) //给第 3 行 type 字段设置报错​
​
_componentRef.delete()​
明细组件特有,删除明细组件中的指定行​
  • 无需入参​
_componentRef.rows[2].delete()​
  • 删除行后,会触发明细组件的「删除行」事件​
context.form.disableSubmit() / context.form.enableSubmit()​
阻止 / 允许表单提交 ​
TIP: 使用「context.form.disableSubmit()」后,如果没有使用「context.form.enableSubmit()」,表单将一直无法提交​
  • 示例​
​
​
context.form.disableSubmit(); //校验开始前先阻止提交,防止校验未完成时表单提交​
var _componentRef = context.event.currentComponent;​
​
if(false){​
_componentRef.setError("校验出错");​
}else{​
_componentRef.clearError();​
context.form.enableSubmit(); //校验通过时,允许提交​
}​
​
context.page​
注意:此属性是页面事件特有的​
获取当前页面信息​
  • 返回示例:​
​
​
{​
"label": {​
"zh_CN": "测试页面",​
"en_US": "Test Page"​
},​
"apiName": "testPage",​
"type": "recordPage", // 页面类型,为 "standard"|"recordPage"​
"objectApiName": "testObj", // 页面关联的对象,当 type 为 "standard" 时为空​
"subPages": [ // 布局为「单页」的页面,该属性值为空​
{​
label:​
children:​
[{label:}]​
}​
{​
"zh_CN": "子页面 1",​
"en_US": "Subpage 1"​
},...​
],​
"currentSubPage": { // 布局为「单页」的页面,该属性值为空​
"zh_CN": "子页面 1",​
"en_US": "Subpage 1"​
},​
"pageVars": {​
"var1": {...}, // 记录类型的页面变量​
"var2": "sample", // 文本类型的页面变量​
"var3": 123123123, // 数字类型的页面变量​
...​
},​
"components": [ // 具有层级结构​
{​
"id": "table_abcsl2d",​
"type": "table",​
"hidden": false,​
"isEditing": false,​
"editingPosition": {},​
"textForSearch": "",​
"filter": [],​
"sort": [],​
"children": {...} // 组件层级结构下的子组件​
}, ...​
],​
...​
}​
​
context.page.setPageVar​
设置页面变量 ​
  • 语法:​
await context.page.setPageVar(varApiName, value)​
  • 示例:​
await context.page.setPageVar("pageVar1", "待更新值");​
  • 不同类型页面变量的数据结构​
​
变量类型​
数据结构​
单值记录​
1712204686210110​
多值记录​
[1713041695850535, 1713041659138109]​
文本​
"text"​
多语文本​
{zh_CN: "文本", en_US: "text"}​
单值选项​
"optionApiName"​
多值选项​
["optionApiName1", "optionApiName2"]​
数字​
123123​
布尔​
true​
日期​
"2021-10-08"​
日期时间​
1633622407000​
邮箱​
手机号​
{key: "+86(CN)", number: "15361000000"}​
​
Web 端调试​
对于Web 端的自定义事件调试,同时支持以下两种方式为代码打断点进行 debug。(移动端中的真机事件调试见:移动端自定义事件真机调试)​
使用 debugger 关键字进行调试​
​
  • 触发时机(以下条件同时发生):​
  • 该表单正在运行(runtime)​
  • 打开浏览器的「检查」​
  • 触发了 debugger 关键字所在的自定义 JS 代码​
​
// 运行时打开浏览器「检查」,执行当前函数时,代码将会停在这里​
debugger; ​
context.event.currentComponent.setValue("1234")​
​
250px|700px|reset
​
​
​
​
在浏览器 Sources 面板中为代码设置断点​
​
在「检查 - Sources」中查看当前表单的 JS 文件,并设置断点​
  • js 文件路径:​
  • 「Sources 面板」/Page/Top/webpack://tem/dxEvent/xxxxxxxx/index.js​
​
​
250px|700px|reset
​
​
​
​
预约飞书企业效能顾问 深度诊断企业痛点,定制专属 AI 办公方案

先进团队,先用飞书

欢迎联系我们,飞书效能顾问将为您提供全力支持
分享先进工作方式
输送行业最佳实践
全面协助组织提效
标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题标题

字节跳动旗下 AI 工作平台

联系我们立即试用