发送事件链接
说明「发送事件」链接如何在点击单元格时向嵌入报表的宿主页面发送自定义事件,包括事件名规则、消息结构、宿主接收方式和限制。
概述
「发送事件」链接用于把报表嵌入其他系统后的联动。点击单元格时,报表不跳转,而是向嵌入它的宿主页面发送一条自定义事件,事件的数据由链接参数按行求值得到。宿主收到后自行处理,例如打开患者详情页、刷新自己的其他区域。
功能入口
设计器 > 选中单元格 > 「单元格属性」面板 > 「链接」页签 > 「添加链接」 > 「发送事件」。
属性说明
| 属性 | 说明 | 取值/默认值 |
|---|---|---|
| 「链接名称」 | 链接名称,必填 | 默认「发送事件」 |
| 「事件名」 | 宿主按此名称分发,必填,提示「请输入事件名」 | 文本,示例 patient-selected;不能以 report: 开头 |
| 「参数配置」 | 作为事件数据(payload)传出的键值对,取值方式见单元格链接概述 | 可为空 |
设置对话框中的说明:点击单元格时向宿主容器(iframe 父页面或嵌入方组件)发送事件,下方参数将作为事件 payload 传出。
report: 前缀保留给系统事件。事件名以 report: 开头时,设计器保存时校验不通过,提示「事件名不能以 report: 开头(该前缀保留给系统事件)」;运行时即使模板里仍有这样的事件名,也会在发送前被丢弃并在控制台输出警告。
消息结构
事件以统一信封发送,protocol 固定为 sight-report。
| 字段 | 说明 |
|---|---|
protocol |
固定 sight-report |
name |
链接上配置的事件名 |
payload |
链接「参数配置」按行求值后的键值对 |
source.reportId |
报表 ID |
source.cellName |
被点击的单元格名,如 B5 |
source.cid |
被点击单元格的实例标识 |
context.parameters |
事件发生时生效的报表参数 |
timestamp |
发送时刻的毫秒时间戳 |
context.parameters 与 payload 分开存放,避免自定义键名与报表参数重名。
宿主如何接收
- iframe 嵌入:宿主监听
window的message事件,取event.data,判断protocol === 'sight-report'后按name分发。自定义事件默认直接发送,宿主无需先订阅。 - 组件嵌入:事件通过 ReportView 组件的
report-event事件发出,宿主组件自行选择监听。 - 目标源(
targetOrigin)的取值顺序为:宿主已发过subscribe握手时锁定的源;否则取document.referrer的源;两者都没有时使用*。宿主发送一条subscribe消息即可锁定精确的源。
宿主页面示例:
window.addEventListener('message', (event) => {
const msg = event.data
if (!msg || msg.protocol !== 'sight-report') return
if (msg.name === 'patient-selected') {
console.log('选中患者', msg.payload.patientId, '来自单元格', msg.source.cellName)
}
})
示例
- 报表以 iframe 嵌入宿主页面。在患者列表报表的「姓名」单元格添加「发送事件」链接,「事件名」填
patient-selected。 - 「参数配置」添加参数
patientId,「值」选「取本行字段」,字段选患者编号(以实际数据集字段为准)。 - 保存并发布。宿主页面按上文代码监听。
- 在宿主中点击列表中的「姓名」,宿主收到
name为patient-selected、payload.patientId为该行患者编号的消息。
注意事项
注意:只有报表运行在 iframe 中或以组件方式嵌入时,事件才有接收方;在浏览器中直接打开报表时,点击不会有可见效果。
注意:通过钻取弹出的子报表不向宿主发送事件,只有最外层报表通过 iframe 通道发送。
提示:payload 需可被结构化克隆,参数值使用文本、数字、布尔等简单类型。
提示:宿主到报表的调用方式(设置参数、查询、导出等)和系统事件,见报表集成。