如果在编辑流程图的过程中,需要对图中元素的动作进行监听,比如:

  • shape.added 新增一个 shape 之后触发
  • shape.removed 删除一个 shape 之后触发
  • connect.end 连线完成后触发

官网提供了很多其他事件
接下来一起来测试一下吧

监听 modeler并绑定事件

还是在之前项目 vue-bpmn 的基础上,在 views 文件夹下新增 event.vue 文件
success() 函数中添加上监听事件的函数

<script>
...
    success () {
      console.log('创建成功')
      this.addModelerListener()
    },
    // 监听 modeler
    addModelerListener () {
      const bpmnjs = this.bpmnModeler
      const that = this
      // 这里用 forEach 给 modeler 上添加要绑定的事件
      const events = ['shape.added', 'shape.move.end', 'shape.removed', 'connect.end', 'connect.move']
      events.forEach(event => {
        that.bpmnModeler.on (event, e => {
          console.log(event, e)
          const elementRegistry = bpmnjs.get('elementRegistry')
          const shape = e.element ? elementRegistry.get(e.element.id) : e.shape
          console.log(shape)
          // 通过监听事件判断操作方式
          if (event === 'shape.added') {
            console.log('新增了shape')
          } else if (event === 'shape.removed') {
            console.log('删除了shape')
          }
        })
      })
    }
...
</script>

效果图
在这里插入图片描述

监听 element 并绑定事件

此小节主要是用于监听用户点击图形上的 element 或者监听某个 element 改变,比如:

  • element.click:点击元素
  • element.changed:当元素发生改变的时候(包括新增、移动、删除元素)

还是在 success() 上添加监听事件 addEventBusListener() ,配置好后,当元素被点击、新增、移动和删除的时候就能监听到了

<script>
...
    success () {
      this.addEventBusListener()
    },
    // 监听 element 
    addEventBusListener () {
      const eventBus = this.bpmnModeler.get('eventBus') // 需要使用 eventBus
      const eventType = ['element.click', 'element.changed'] // 需要监听的事件集合
      eventType.forEach (eventType => {
        eventBus.on(eventType, e => {
          console.log(e)
        })
      })
    }
...
</script>

当点击画布的时候,有可能根元素也会触发此事件,一般是不想让它触发的,我们可以在 eventBus.on() 的回调函数中添加一个判断来避免这个问题。

eventBus.on(eventType, e => {
  if (!e || e.element.type == 'bpmn:Process') return // 这里根元素是 bpmn:Process
  console.log(e)
})

我们可以使用 elementRegistry 来获取 shape 信息,使用 e.elementshape 获取到的信息是一样的,不过更推荐用elementRegistry 来获取 shape 信息

    // 监听 element 
    addEventBusListener () {
      const eventBus = this.bpmnModeler.get('eventBus') // 需要使用 eventBus
      const eventType = ['element.click', 'element.changed'] // 需要监听的事件集合
      eventType.forEach (eventType => {
        eventBus.on(eventType, e => {
          if (!e || e.element.type == 'bpmn:Process') return // 这里根元素是 bpmn:Process
          console.log(e)
          const elementRegistry = this.bpmnModeler.get('elementRegistry')
          const shape = elementRegistry.get(e.element.id) // 传递 id 进去
          console.log(shape) // {Shape}
          console.log(e.element) // {Shape}
          console.log(JSON.stringify(shape) === JSON.stringify(e.element)) // true
        })
      })
    }

在这里插入图片描述

Logo

前往低代码交流专区

更多推荐