bpmn-js 事件总线处理

2024-02-15 13:52
文章标签 js 处理 事件 总线 bpmn

本文主要是介绍bpmn-js 事件总线处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

bpmn-js中使用EventBus作为事件的处理句柄,EventBus的使用和我们常规使用的事件总线没啥大的区别,其源码位于:/diagram-js/lib/core/EventBus.js bpmn-js使用diagram-js实现流程图的web端绘制呈现工具)。

EventBus使用

事件总线使用基本都是以监听、回调的方式来实现的。diagram-js提供的EventBus也不无例外。如下为EventBus使用方式。

1、添加监听事件

diagram-js提供的EventBus在监听方式上提供了几种不同的选择,如下,可根据需要选择不同的监听方式:

  • 普通监听
  • 带参监听
  • 返回值监听
  • 优先级监听
  • 上下文监听
 * // listen for event* eventBus.on('foo', function(event) {**   // access event type*   event.type; // 'foo'**   // stop propagation to other listeners*   event.stopPropagation();**   // prevent event default*   event.preventDefault();* });** // listen for event with custom payload* eventBus.on('bar', function(event, payload) {*   console.log(payload);* });** // listen for event returning value* eventBus.on('foobar', function(event) {**   // stop event propagation + prevent default*   return false;**   // stop event propagation + return custom result*   return {*     complex: 'listening result'*   };* });*** // listen with custom priority (default=1000, higher is better)* eventBus.on('priorityfoo', 1500, function(event) {*   console.log('invoked first!');* });*** // listen for event and pass the context (`this`)* eventBus.on('foobar', function(event) {*   this.foo();* }, this);

2、发送事件

EventBus通过fire来发送事件,发送事件可配合上述不同类型监听实现。

 ** // false indicates that the default action* // was prevented by listeners* if (eventBus.fire('foo') === false) {*   console.log('default has been prevented!');* };*** // custom args + return value listener* eventBus.on('sum', function(event, a, b) {*   return a + b;* });** // you can pass custom arguments + retrieve result values.* var sum = eventBus.fire('sum', 1, 2);* console.log(sum); // 3

3、其他操作

  • off:移除监听回调,若回调函数为空,则移除该监听的所有回调
  • createEvent: 创建一个可被EventBus识别的事件
  • once:注册一个只能被监听一次的事件

如何使用eventbus?

我们可以通过bpmn-js获取的viewer/modeler对象在diagram-js加载完成后添加事件监听。通过bpmn-js提供的eventbus来进行事件监听可以帮助我们给流程编辑器添加钩子和流程图交互配置,如通过监听事件适当添加配置属性。

1、使用viewer进行监听

viewer可以在加载完成diagram-js加载完成后通过viewer.get('eventBus')获取eventbus

var viewer = new BpmnJS({ container: bpmnContainer});try {await viewer.importXML(diagramXM); // 此处异步操作完成后可进行事件操作var eventBus = viewer.get('eventBus');// you may hook into any of the following eventsvar events = ['element.hover','element.out','element.click','element.dblclick','element.mousedown','element.mouseup'];events.forEach(function(event) {eventBus.on(event, function(e) {// e.element = the model element// e.gfx = the graphical elementlog(event, 'on', e.element.id);});});} catch (err) {console.error('Error happened: ', err);
}

可以通过off来取消监听,但需要改变下写法:

var viewer = new BpmnJS({ container: bpmnContainer});try {await viewer.importXML(diagramXM); // 此处异步操作完成后可进行事件操作var eventBus = viewer.get('eventBus');function ensureHoveringProcess(event) {event.element = rootElement;event.gfx = rootElementGfx;}eventBus.on('element.hover', ensureHoveringProcess)// 监听之后eventBus.off('element.hover', ensureHoveringProcess);
// 或者如下取消所有element.hover的监听eventBus.off('element.hover')} catch (err) {console.error('Error happened: ', err);
}

2、使用Modeler进行监听

modeler可以直接使用modeler对象进行监听和取消监听操作,而无需额外获取:

modeler.on('commandStack.changed', () => {// user modeled something or// performed an undo/redo operation
});modeler.on('element.changed', (event) => {const element = event.element;// the element was changed by the user
});

3、依赖注入

bpmn-js提供给我们足够大的自定义空间,通过在modeler/viewer中的additionalModules配置让我们可以进行各类插件的自定义改装操作,可参照Bpmn-js自定义Palette:

const bpmnModeler = new BpmnModeler({container: this.$refs["bpmn-canvas"],additionalModules: [],});

而自定义的additionalModules通过使用$inject属性来声明依赖注入的各个模块。如此我们也可以通过这种方式创建一个单独进行logger记录的插件:

 // logger插件function InteractionLogger(eventBus) {eventBus.on('element.hover', function(event) {console.log()})}InteractionLogger.$inject = [ 'eventBus' ]; // 注入插件模块// 插件模块声明var extensionModule = {__init__: [ 'interactionLogger' ],interactionLogger: [ 'type', InteractionLogger ]
};// viewer加载
var bpmnViewer = new Viewer({container:viewerContainer, additionalModules: [ extensionModule ] 
});
// modeler加载
var bpmnModeler = new BpmnModeler({container:viewerContainer, additionalModules: [ extensionModule ] 
})

我们也可以通过自定义元素shape、palette时注入eventbus,添加我们自己的事件监听。

内置事件

通过diagram-js实现的元素绘制、布局相应的其会在内部内置元素的各类事件以提供我们调试,跟踪事件以及其他额外元素操作使用,在使用bpmn-js较为常见的事件监听如下:

1、元素事件类

element.changed,
element.out,
element.hover,
element.updateId,
element.marker.update,
bpmnElement.added

2、copyPaste类

moddleCopy.canCopyProperties,
moddleCopy.canSetCopiedProperty,
copyPaste.canCopyElements,
copyPaste.elementsCopied,
copyPaste.pasteElements,
copyPaste.pasteElement,
copyPaste.createTree,
copyPaste.copyElement

3、contextPad类

contextPad.trigger,
contextPad.open,
contextPad.create,
contextPad.close

4、render类

canvas.viewbox.changing,
canvas.init,
canvas.viewbox.changed,
canvas.resized,
render.shape,
render.getShapePath,
render.connection,
render.getConnectionPath,
canvas.destroy,
diagram.init,
diagram.destroy,
diagram.clear

5、connect类

connection.added,
connection.removed,
connect.ended,
connect.canceled

这篇关于bpmn-js 事件总线处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/711570

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

无人叉车3d激光slam多房间建图定位异常处理方案-墙体画线地图切分方案

墙体画线地图切分方案 针对问题:墙体两侧特征混淆误匹配,导致建图和定位偏差,表现为过门跳变、外月台走歪等 ·解决思路:预期的根治方案IGICP需要较长时间完成上线,先使用切分地图的工程化方案,即墙体两侧切分为不同地图,在某一侧只使用该侧地图进行定位 方案思路 切分原理:切分地图基于关键帧位置,而非点云。 理论基础:光照是直线的,一帧点云必定只能照射到墙的一侧,无法同时照到两侧实践考虑:关

禁止平板,iPad长按弹出默认菜单事件

通过监控按下抬起时间差来禁止弹出事件,把以下代码写在要禁止的页面的页面加载事件里面即可     var date;document.addEventListener('touchstart', event => {date = new Date().getTime();});document.addEventListener('touchend', event => {if (new

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

Thymeleaf:生成静态文件及异常处理java.lang.NoClassDefFoundError: ognl/PropertyAccessor

我们需要引入包: <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework</groupId><artifactId>sp

使用JS/Jquery获得父窗口的几个方法(笔记)

<pre name="code" class="javascript">取父窗口的元素方法:$(selector, window.parent.document);那么你取父窗口的父窗口的元素就可以用:$(selector, window.parent.parent.document);如题: $(selector, window.top.document);//获得顶级窗口里面的元素 $(

js异步提交form表单的解决方案

1.定义异步提交表单的方法 (通用方法) /*** 异步提交form表单* @param options {form:form表单元素,success:执行成功后处理函数}* <span style="color:#ff0000;"><strong>@注意 后台接收参数要解码否则中文会导致乱码 如:URLDecoder.decode(param,"UTF-8")</strong></span>