vue项目中使用bpmn-节点篇
内容概述
本系列 “vue项目中使用bpmn-xxxx” 分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中。主要包括vue项目中bpmn使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。如果转载或通过爬虫直接爬的,格式特别丑,请来原创看:我是作者原文
前情提要
根据之前的操作,我们可以创建、导入、导出流程图,并对其进预览。通过此篇可以学到:
- 为节点添加点击、鼠标悬浮等事件
- 获取流程图内所有指定类型的节点
- 通过外部更新节点名字
- 获取节点实例的两种方法,根据节点id拿到元素实例
来看一眼效果图

step1:为节点添加点击、鼠标悬浮等事件
方案:bpmnModeler中的eventBus,只要你要,只要它有
代码:
const eventBus = this.bpmnModeler.get('eventBus');
// 注册节点事件,eventTypes中可以写多个事件
const eventTypes = ['element.click', 'element.hover'];
eventTypes.forEach((eventType) => {
eventBus.on(eventType, (e) => {
const {element} = e;
if (!element.parent) return;
if (!e || element.type === 'bpmn:Process') {
return false;
} else {
if (eventType === 'element.click') {
// 节点点击后想要做的处理
// 此时想要点击节点后,拿到节点实例,通过外部输入更新节点名称
this.currentElement = element;
} else if (eventType === 'element.hover') {
// 鼠标滑过节点后想要做的处理
console.log('鼠标经过节点啦~');
}
}
});
});
step2:获取流程图内所有指定类型的节点
场景:需要获取流程图里所有的用户节点信息,以列表形式展示在另外地方。查了很多文档,并没有找到。事实证明,源码才是王道!
方案:elementRegistry提供了方案,并且支持过滤
代码:
const elementRegistry = this.bpmnModeler.get('elementRegistry');
const userTaskList = elementRegistry.filter(
(item) => item.type === 'bpmn:UserTask'
);
step3 : 通过外部更新节点名字
方案:bpmnModeler的modeling,提供了updateLabel方法,modeling.updateLabel(节点id,新名字);
step4: 获取节点实例的两种方法
4.1 通过step1中的点击事件等,可以直接拿到目标对象e,e.element就是节点实例
eventBus.on('element.click', (e) => {console.log(e.element);})
4.2 没有任何事件可以触发,手里空空只有一个节点id
方案:bpmnModeler的elementRegistry来解围!
const elementRegistry = this.bpmnModeler.get('elementRegistry');
console.log(elementRegistry.get(节点id));
后续
上文代码都是片段,特此附上完整代码:老规矩:data中的chart变量流程图xml文件数据,由于行数过多,附在了附件中(点我!点我),使用时,将附件内容复制过来,赋值给chart即可运行!
<template>
<div class="containerBox">
<div style="margin-left: 250px">
通过输入框更改节点名称:
<el-input
v-model.trim="nodeName"
placeholder="请输入节点名称"
clearable
@input="inputChange"
style="width: 200px">
</el-input>
</div>
<div id="container"></div>
</div>
</template>
<script>
import BpmnModeler from 'bpmn-js/lib/Modeler';
import camundaExtension from './resources/camunda';
import {tempDetail, saveCanvas} from '@api/processConfig'; export default {
name: 'index',
data() {
return {
containerEl: null,
bpmnModeler: null,
currentElement: {},
nodeName: "",
// chart变量流程图xml文件数据,由于行数过多,附在了附件中,使用时,将附件整个赋值给chart即可
chart: '<bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">\n' +
'<bpmn:process id="Process_1" isExecutable="false">\n' +
'<bpmn:startEvent id="StartEvent_1">\n' +
'<bpmn:outgoing>Flow_021z3si</bpmn:outgoing>\n' +
'</bpmn:startEvent>\n' +
'<bpmn:serviceTask id="Activity_1fru9kc" name="我是第一个节点">\n' +
'<bpmn:incoming>Flow_021z3si</bpmn:incoming>\n' +
'<bpmn:outgoing>Flow_1hwj8kv</bpmn:outgoing>\n' +
'</bpmn:serviceTask>\n' +
'<bpmn:sequenceFlow id="Flow_021z3si" sourceRef="StartEvent_1" targetRef="Activity_1fru9kc"> </bpmn:sequenceFlow>\n' +
'<bpmn:userTask id="Activity_0ozmm5p" name="第二名">\n' +
'<bpmn:incoming>Flow_1hwj8kv</bpmn:incoming>\n' +
'<bpmn:outgoing>Flow_1tbnntc</bpmn:outgoing>\n' +
'</bpmn:userTask>\n' +
'<bpmn:sequenceFlow id="Flow_1hwj8kv" sourceRef="Activity_1fru9kc" targetRef="Activity_0ozmm5p"> </bpmn:sequenceFlow>\n' +
'<bpmn:sequenceFlow id="Flow_1tbnntc" sourceRef="Activity_0ozmm5p" targetRef="Event_03kmy6i"> </bpmn:sequenceFlow>\n' +
'<bpmn:endEvent id="Event_03kmy6i">\n' +
'<bpmn:incoming>Flow_1tbnntc</bpmn:incoming>\n' +
'</bpmn:endEvent>\n' +
'</bpmn:process>\n' +
'<bpmndi:BPMNDiagram id="BPMNDiagram_1">\n' +
'<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="Process_1">\n' +
'<bpmndi:BPMNEdge id="Flow_021z3si_di" bpmnElement="Flow_021z3si">\n' +
'<di:waypoint x="209" y="120"/>\n' +
'<di:waypoint x="290" y="120"/>\n' +
'</bpmndi:BPMNEdge>\n' +
'<bpmndi:BPMNEdge id="Flow_1hwj8kv_di" bpmnElement="Flow_1hwj8kv">\n' +
'<di:waypoint x="390" y="120"/>\n' +
'<di:waypoint x="480" y="120"/>\n' +
'</bpmndi:BPMNEdge>\n' +
'<bpmndi:BPMNEdge id="Flow_1tbnntc_di" bpmnElement="Flow_1tbnntc">\n' +
'<di:waypoint x="580" y="120"/>\n' +
'<di:waypoint x="672" y="120"/>\n' +
'</bpmndi:BPMNEdge>\n' +
'<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">\n' +
'<dc:Bounds x="173" y="102" width="36" height="36"/>\n' +
'</bpmndi:BPMNShape>\n' +
'<bpmndi:BPMNShape id="Activity_1fru9kc_di" bpmnElement="Activity_1fru9kc">\n' +
'<dc:Bounds x="290" y="80" width="100" height="80"/>\n' +
'</bpmndi:BPMNShape>\n' +
'<bpmndi:BPMNShape id="Activity_0ozmm5p_di" bpmnElement="Activity_0ozmm5p">\n' +
'<dc:Bounds x="480" y="80" width="100" height="80"/>\n' +
'</bpmndi:BPMNShape>\n' +
'<bpmndi:BPMNShape id="Event_03kmy6i_di" bpmnElement="Event_03kmy6i">\n' +
'<dc:Bounds x="672" y="102" width="36" height="36"/>\n' +
'</bpmndi:BPMNShape>\n' +
'<bpmndi:BPMNShape id="Activity_0lkkmka_di">\n' +
'<dc:Bounds x="820" y="80" width="100" height="80"/>\n' +
'</bpmndi:BPMNShape>\n' +
'<bpmndi:BPMNEdge id="Flow_1t2mucq_di">\n' +
'<di:waypoint x="920" y="120"/>\n' +
'<di:waypoint x="1012" y="120"/>\n' +
'</bpmndi:BPMNEdge>\n' +
'</bpmndi:BPMNPlane>\n' +
'</bpmndi:BPMNDiagram>\n' +
'</bpmn:definitions>'
};
},
mounted() {
this.containerEl = document.getElementById('container');
this.bpmnModeler = new BpmnModeler({
container: this.containerEl,
moddleExtensions: {camunda: camundaExtension}
});
this.showChart();
},
methods: {
getShapeById() {
const elementRegistry = this.bpmnModeler.get('elementRegistry');
console.log(elementRegistry.get('Activity_0ozmm5p'));
},
inputChange(val) {
const modeling = this.bpmnModeler.get('modeling');
if (JSON.stringify(this.currentElement) === '{}') {
this.$message.info('请保证要更改的节点处于选中状态!');
return false;
} else {
modeling.updateLabel(this.currentElement, val);
}
},
// 流程图回显
showChart() {
this.bpmnModeler.importXML(this.chart, (err) => {
if (!err) {
this.addEventBusListener();
this.getNodeInfoList();
this.getShapeById();
}
});
},
// 获取流程图中所有节点信息
getNodeInfoList() {
const elementRegistry = this.bpmnModeler.get('elementRegistry');
const userTaskList = elementRegistry.filter(
(item) => item.type === 'bpmn:UserTask'
);
// 此时得到的userTaskList 便是流程图中所有的用户节点的集合
console.log(userTaskList);
},
addEventBusListener() {
const eventBus = this.bpmnModeler.get('eventBus');
// 注册节点事件,eventTypes中可以写多个事件
const eventTypes = ['element.click', 'element.hover'];
eventTypes.forEach((eventType) => {
eventBus.on(eventType, (e) => {
const {element} = e;
if (!element.parent) return;
if (!e || element.type === 'bpmn:Process') {
return false;
} else {
if (eventType === 'element.click') {
// 节点点击后想要做的处理
// 此时想要点击节点后,拿到节点实例,通过外部输入更新节点名称
this.currentElement = element;
} else if (eventType === 'element.hover') {
// 鼠标滑过节点后想要做的处理
console.log('鼠标经过节点啦~');
}
}
});
});
}
}
};
</script>
<style lang="scss">
.containerBox {
height: calc(100vh - 220px);
position: relative; #container {
height: calc(100% - 50px);
}
}
</style>
想获取完整源码或有问题,欢迎大家关注我的公粽号,扫下面二维码或微信搜“Lemoncool”,即可获取~
可爱的你可能还需要
- vue项目中使用bpmn-番外篇(留言问题总结)
- vue项目中使用bpmn-流程图json属性转xml(七篇更新完成)
- vue项目中使用bpmn-流程图xml文件中节点属性转json结构
- vue项目中使用bpmn-自定义platter
- vue项目中使用bpmn-流程图预览篇
- vue项目中使用bpmn-节点添加颜色
- vue项目中使用bpmn-基础篇
vue项目中使用bpmn-节点篇的更多相关文章
- vue项目中使用bpmn-为节点添加颜色
内容概述 本系列 “vue项目中使用bpmn-xxxx” 分为五篇,均为自己使用过程中用到的实例,手工原创,目前属于陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意 ...
- vue项目中使用bpmn-基础篇
内容概述 本系列“vue项目中使用bpmn-xxxx”分为五篇,均为自己使用过程中用到的实例,手工原创,目前属于陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项 ...
- vue项目中使用bpmn-番外篇(留言问题总结)
前情提要 “vue项目中使用bpmn-xxxx”系列的七篇文章在上周已经更新完成,发表后,有小伙伴在使用时提出了一些文章中没有讲到的问题,此篇作为番外篇,将大家提出的共性问题解答一下,欢迎大家支持原创 ...
- vue项目中使用bpmn-流程图预览篇
前情提要 上文已经实现了节点操作的前进.后退.导入.导出等操作,今日来实现“流程图预览”,以及视图的放大缩小 前提:项目安装过bpmn,安装可见上篇文章 实现要点 bpmn提供了两个神器:Modele ...
- vue项目中使用bpmn-流程图xml文件中节点属性转json结构
内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...
- vue项目中使用bpmn-流程图json属性转xml(七篇更新完成)
内容概述 本系列“vue项目中使用bpmn-xxxx”分为七篇,均为自己使用过程中用到的实例,手工原创,目前陆续更新中.主要包括vue项目中bpmn使用实例.应用技巧.基本知识点总结和需要注意事项,具 ...
- vue项目中使用bpmn-自定义platter
前情提要 经过前四篇的学习,我们能够实现bpmn基本绘图.预览.为节点加事件加颜色等效果,这一篇我们来说,如何自定义左侧工具栏(platter),首先看一下自定义前后效果图对比: 我们本次要实现的目标 ...
- vue项目中遇到的那些事。
前言 有好几天没更新文章了.这段实际忙着做了一个vue的项目,从 19 天前开始,到今天刚好 20 天,独立完成. 做vue项目做这个项目一方面能为工作做一些准备,一方面也精进一下技术. 技术栈:vu ...
- 转:如何在Vue项目中使用vw实现移动端适配
https://www.w3cplus.com/mobile/vw-layout-in-vue.html 有关于移动端的适配布局一直以来都是众说纷纭,对应的解决方案也是有很多种.在<使用Flex ...
随机推荐
- 超参数、验证集和K-折交叉验证
本文首发自公众号:RAIS 前言 本系列文章为 <Deep Learning> 读书笔记,可以参看原书一起阅读,效果更佳. 超参数 参数:网络模型在训练过程中不断学习自动调节的变量,比如 ...
- AI领域:如何做优秀研究并写高水平论文?
来源:深度强化学习实验室 每个人从本科到硕士,再到博士.博士后,甚至工作以后,都会遇到做研究.写论文这个差事.论文通常是对现有工作的一个总结和展示,特别对于博士和做研究的人来说,论文则显得更加重要. ...
- 医学图像分割-在3DSlicer中使用英伟达的AI辅助工具NvidiaAIAssistedAnnotation自动切割医学图像教程
前期准备 下载3DSlicer并安装: 3DSlicer官网(http://www.slicer.org)或者直接下载(https://download.slicer.org),需要注意目前该插件只支 ...
- Ubuntu系统在Anaconda中安装Python3.6的虚拟环境
原因:Anaconda的python版本是3.7的,TensorFlow尚不支持此版本,于是我们创建一个Python的虚拟环境以支持TensorFlow 创建tf环境 conda create --n ...
- XDebug的配置和使用
简介 XDebug是一个开放源代码的PHP程序调试器(即一个Debug工具) 可以用来跟踪,调试和分析PHP程序的运行状况 功能强大的神器,对审计有非常大的帮助. 官网:http://www.xdeb ...
- JSP+SSH+Mysql+C3P0实现的传智播客网上商城
项目简介 项目来源于:https://gitee.com/2121/shop 本系统是传智播客授课时的开发案例,基于JSP+SSH+Mysql的简单网上商城.在当代开发中,SSH的使用已经逐渐被SSM ...
- SWUSTOJ 509B 恶心了几个月想不通的low题
SWUSTOJ 509B 这个题恶心了我好久,细细算来不难,算总天数,减去星期一,与4取余, 问题在最后除掉多余的星期一,按照上述算法,在最后一个星期会出现过了星期一但不足7天,程序未能减去多余的星期 ...
- Flink| 实时需要分析
========================实时流量统计 1. 实时热门商品HotItems 每隔 5 分钟输出最近一小时内点击量最多的前 N 个商品. 抽取出业务时间戳,告诉 Flink 框架基 ...
- PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分)
PTA数据结构与算法题目集(中文) 7-35 城市间紧急救援 (25 分) 作为一个城市的应急救援队伍的负责人,你有一张特殊的全国地图.在地图上显示有多个分散的城市和一些连接城市的快速道路.每个城市 ...
- 大数据篇:Hbase
大数据篇:Hbase Hbase是什么 Hbase是一个分布式.可扩展.支持海量数据存储的NoSQL数据库,物理结构存储结构(K-V). 如果没有Hbase 如何在大数据场景中,做到上亿数据秒级返回. ...