1.bpmn,js的事件
在 bpmn.js
中,节点事件绑定主要用于监听和响应流程图中 BPMN 元素(如任务、事件、网关等)的交互行为。你可以通过事件绑定实现点击高亮、属性展示、自定义右键菜单、节点拖动等交互逻辑。
🧩 1.常见事件类型
事件类型 | 事件名称 | 触发时机 | 典型应用场景 |
---|---|---|---|
画布操作 | canvas.init |
画布初始化完成时 | 初始化后加载自定义插件 |
canvas.destroy |
画布实例销毁时 | 资源清理或内存管理 | |
canvas.viewbox.changed |
画布缩放/平移后 | 同步外部导航控件状态 | |
元素生命周期 | shape.added |
新增图形元素(如任务、网关) | 自动为新元素设置默认属性 |
connection.added |
新增连接线(如顺序流、消息流) | 校验连线合法性 | |
shape.removed |
删除图形元素 | 触发关联数据清理 | |
connection.changed |
连接线属性修改(如条件表达式更新) | 动态更新流程逻辑 | |
用户交互 | element.click |
点击元素(返回元素实例) | 显示上下文菜单或属性面板3 |
element.dblclick |
双击元素 | 快速编辑元素名称 | |
element.hover |
鼠标悬停元素 | 高亮显示元素依赖关系 | |
selection.changed |
选中元素变更 | 多选批量操作 | |
数据交换 | import.render.start |
开始解析 BPMN XML 前 | 显示加载进度条 |
import.render.complete |
流程图渲染完成 | 执行布局优化或自动保存 | |
saveXML.start |
导出 XML 前 | 添加元数据注释 | |
模型控制 | diagram.init |
流程图模型初始化完成 | 绑定自定义键盘快捷键4 |
diagram.clear |
流程图被清空 | 重置协同编辑状态 | |
root.added |
新增流程根元素(如 Process、Collaboration) | 多流程项目管理 |
🎯 二、绑定事件的方式
✅ 方法一:使用 modeler.on()
或 viewer.on()
modeler.on('element.click', (event) => {
const { element } = event;
console.log('点击的元素:', element);
});
✅ 方法二:注册插件方式(适用于复杂逻辑)
你可以在插件中监听事件:
export default function CustomEventPlugin(eventBus) {
eventBus.on('element.click', (event) => {
const { element } = event; alert(`你点击了 ${element.type} 类型的节点`);
}); }
CustomEventPlugin.$inject = ['eventBus'];
然后在初始化时引入该插件:
const modeler = new BpmnModeler({ container: '#canvas',
additionalModules: [CustomEventPlugin] });
📌 三、常用事件详解
1️⃣ element.click
—— 点击节点事件
modeler.on('element.click', (event) => {
const { element } = event; if (element.type === 'bpmn:Task') {
alert(`你点击了一个任务节点:${element.id}`); } });
2️⃣ selection.changed
—— 选中变化事件
modeler.on('selection.changed', ({ newSelection }) => {
if (newSelection.length > 0) {
const selectedElement = newSelection[0];
console.log('当前选中节点:', selectedElement);
}
});
3️⃣ element.hover
/ element.out
—— 悬停事件
可用于实现鼠标悬停高亮、显示工具提示等效果:
modeler.on('element.hover', (event) => {
{ element } = event;
console.log('鼠标悬停在:', element.id);
});
modeler.on('element.out', (event) => {
const { element } = event;
console.log('鼠标离开:', element.id);
});
4️⃣ commandStack.changed
—— 流程图修改事件
当用户编辑流程图后,可以自动保存最新 XML 内容:
modeler.on('commandStack.changed', async () => {
const { xml } = await modeler.saveXML({ format: true });
console.log('流程图已更新:', xml);
});
5️⃣ shape.added
—— 新增节点事件
modeler.on('shape.added', (event) => {
const { shape } = event; console.log('新增了一个节点:', shape);
});
🎨 四、示例:点击节点高亮 + 展示属性
import React, { useEffect, useRef } from 'react';
import BpmnModeler from 'bpmn-js/lib/Modeler';
const BpmnEditor = ({ xmlString }) => { c
onst ref = useRef(null);
useEffect(() => {
if (!ref.current || !xmlString) return;
const modeler = new BpmnModeler({ container: ref.current, }); modeler.importXML(xmlString).catch((err) => {
console.error('Failed to load BPMN', err); });
// 监听节点点击事件
modeler.on('element.click', (event) => {
const { element } = event;
if (element.type !== 'bpmn:Process') {
alert(`你点击了节点:${element.id} (${element.type})`);
}
});
// 监听选中变化事件 modeler.on('selection.changed', ({ newSelection }) => {
if (newSelection.length > 0) {
const selected = newSelection[0];
console.log('当前选中:', selected.businessObject);
}
});
},
[xmlString]);
return <div ref={ref} style={
{ width: '100%', height: '600px' }} />;
};
export default BpmnEditor;
🧱 五、进阶:绑定右键菜单事件(Context Pad)
你可以监听 contextPad.open
来扩展右键菜单功能:
modeler.on('contextPad.open', (event) => {
const { element } = event;
console.log('右键菜单打开于节点:', element.id);
});
也可以通过插件方式自定义右键菜单项,例如添加“复制”、“删除”等功能。
✅ 总结
功能 | 推荐事件 |
---|---|
点击节点 | element.click |
获取选中节点 | selection.changed |
鼠标悬停/离开 | element.hover / element.out |
节点新增 | shape.added |
流程图变更 | commandStack.changed |
自定义右键菜单 | contextPad.open |
2.ElementFactory
Diagram元素工厂
1.ElementFactory 的核心功能
-
元素实例化
- 作为底层工厂类,负责创建 BPMN 元素实例,用于创建符合 BPMN 2.0 规范的流程元素(如任务、网关、事件等),返回包含业务对象(
businessObject
)和图形定义(di
)的完整元素模型 ,并自动生成唯一 ID(格式为类型_序号
,
- 作为底层工厂类,负责创建 BPMN 元素实例,用于创建符合 BPMN 2.0 规范的流程元素(如任务、网关、事件等),返回包含业务对象(