bpmn.js教程2

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 的核心功能

  1. 元素实例化

    • 作为底层工厂类,负责创建 BPMN 元素实例,用于创建符合 BPMN 2.0 规范的流程元素(如任务、网关、事件等),返回包含业务对象(businessObject)和图形定义(di)的完整元素模型  ,并自动生成唯一 ID(格式为 类型_序号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值