EventBus API
大约 2 分钟
EventBus API
EventBus 是 vjmapext 的事件发布/订阅总线,所有子系统通过它进行解耦通信。
引入
const { EventBus, VjmapextEvents } = vjmapext;通常直接通过 mapcadLayer.eventBus 访问实例,无需手动创建。
方法
on(event, handler)
订阅事件。
| 参数 | 类型 | 说明 |
|---|---|---|
| event | string | 事件名称 |
| handler | Function | 事件处理函数 |
mapcadLayer.eventBus.on('entity:added', (data) => {
console.log('新增实体:', data.entity.id);
});off(event, handler)
取消订阅。必须传入与 on 相同的函数引用。
| 参数 | 类型 | 说明 |
|---|---|---|
| event | string | 事件名称 |
| handler | Function | 之前注册的处理函数 |
emit(event, data?)
触发事件。
| 参数 | 类型 | 说明 |
|---|---|---|
| event | string | 事件名称 |
| data | any | 可选,事件数据 |
clear()
移除所有事件监听器。
事件常量 VjmapextEvents
使用 VjmapextEvents 可获得类型安全的事件名称常量:
const { VjmapextEvents } = vjmapext;
mapcadLayer.eventBus.on(VjmapextEvents.EntityAdded, handler);完整事件参考
实体事件
| 事件名 | 常量 | 触发时机 | 数据结构 |
|---|---|---|---|
entity:added | EntityAdded | 实体添加到 store | { entity } |
entity:deleted | EntityDeleted | 实体从 store 删除 | { entity } |
entity:modified | EntityModified | 实体属性变更 | { entity, styleOnly?: boolean } |
提示
entity:modified 中 styleOnly: true 表示仅样式变更(如颜色),不涉及几何变化,属性面板可据此决定是否刷新。
鼠标交互事件
| 事件名 | 常量 | 触发时机 | 数据结构 |
|---|---|---|---|
entity:mouseenter | EntityMouseEnter | 鼠标进入实体区域 | { entity, originalEvent } |
entity:mouseleave | EntityMouseLeave | 鼠标离开实体区域 | { entity, originalEvent } |
entity:click | EntityClick | 单击实体 | { entity, originalEvent } |
entity:dblclick | EntityDblClick | 双击实体 | { entity, originalEvent } |
选择事件
| 事件名 | 常量 | 触发时机 | 数据结构 |
|---|---|---|---|
selection:changed | SelectionChanged | 选择集变化 | { selected: string[], deselected: string[] } |
命令与模式事件
| 事件名 | 常量 | 触发时机 | 数据结构 |
|---|---|---|---|
command:started | CommandStarted | 命令开始执行 | { name } |
command:ended | CommandEnded | 命令执行结束 | { name } |
mode:changed | ModeChanged | 编辑/浏览模式切换 | { mode } |
输入事件
| 事件名 | 常量 | 触发时机 | 数据结构 |
|---|---|---|---|
input:started | InputStarted | 输入开始 | — |
input:ended | InputEnded | 输入结束 | — |
boxselect:started | BoxSelectStarted | 框选开始 | — |
boxselect:ended | BoxSelectEnded | 框选结束 | — |
系统事件
| 事件名 | 常量 | 触发时机 | 数据结构 |
|---|---|---|---|
render:requested | RenderRequested | 请求重新渲染 | — |
store:changed | StoreChanged | 数据存储变化 | — |
使用示例
const bus = mapcadLayer.eventBus;
// 监听选择变化
bus.on(VjmapextEvents.SelectionChanged, ({ selected, deselected }) => {
console.log(`选中 ${selected.length} 个,取消 ${deselected.length} 个`);
});
// 监听命令执行
bus.on(VjmapextEvents.CommandStarted, ({ name }) => {
console.log(`命令开始: ${name}`);
});
// 监听模式切换
bus.on(VjmapextEvents.ModeChanged, ({ mode }) => {
console.log(`当前模式: ${mode}`);
});