BPMN.js的基础说明

1,154 阅读2分钟

一、BPMN.js的基础使用

主要分为三个类来满足不同的用户需求。

Viewer:BPMN图表查看器,功能最简单,仅用来展示。

NavigatedViewer:在 Viewer 上扩展了导航和缩放的功能,包含鼠标导航工具的图表查看器。

Modeler:融合了Viewer 和 NavigatedViewer,并拥有工具栏、属性面板等,实现建模能力。

1、Viewer 基础用法

BPMN图表查看器,功能最简单,仅用来展示。

import Modeler from 'bpmn-js/lib/Viewer'
import { xmlStr } from './xmlData.js'
 
/**
 * A base viewer for BPMN 2.0 diagrams.
 *
 * Have a look at {@link Viewer}, {@link NavigatedViewer} or {@link Modeler} for
 * bundles that include actual features.
 *
 * @param {Object} [options] configuration options to pass to the viewer
 * @param {DOMElement} [options.container] the container to render the viewer in, defaults to body.
 * @param {string|number} [options.width] the width of the viewer
 * @param {string|number} [options.height] the height of the viewer
 * @param {Object} [options.moddleExtensions] extension packages to provide
 * @param {Array<didi.Module>} [options.modules] a list of modules to override the default modules
 * @param {Array<didi.Module>} [options.additionalModules] a list of modules to use with the default modules
 */


const bpmnViewer = new Modeler(options)  // new一个Viewer对象的实例 options类型为optionsType
const { warnings } = await bpmnViewer.importXML(xmlStr)  // 导出xml文件
bpmnViewer.get('canvas').zoom('fit-viewport', 'auto') // 调整位置在正中间
 
interface optionsType {
  container: DOMElement,
  width: string|number,
  height: string|number,
  moddleExtensions: Object, // 提供的扩展包
  modules: Array<didi.Module>, // 覆盖默认module的一系列module
  additionalModules: Array<didi.Module> // 与默认包一起使用的module
}

2、NavigatedViewer 基础用法

NavigatedViewer 显示和导航 BPMN 图

在 Viewer 的基础上,小小的修改  

import Modeler from 'bpmn-js/lib/Viewer'
 
改为
 
import Modeler from 'bpmn-js/lib/NavigatedViewer'

3、Modeler 基础用法

融合了Viewer 和 NavigatedViewer,并拥有工具栏、属性面板等,实现建模能力。

import Modeler from 'bpmn-js/lib/Modeler'
import 'bpmn-js/dist/assets/diagram-js.css' // 左边工具栏以及编辑节点的样式
import 'bpmn-js/dist/assets/bpmn-font/css/bpmn.css'
import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-codes.css'
import 'bpmn-js/dist/assets/bpmn-font/css/bpmn-embedded.css'
import { xmlStr } from './xmlData.js'
export default {
  data() {
    return {
      bpmnModeler: null
    }
  },
  async mounted() {
    this.bpmnModeler = new Modeler({
      container: this.$refs.canvas
    })

    try {
      const { warnings } = await this.bpmnModeler.importXML(xmlStr)
      // 调整在正中间
      this.bpmnModeler.get('canvas').zoom('fit-viewport', 'auto')
      console.log('rendered')
    } catch (err) {
      console.log('error rendering', err)
    }
  }
}

 

二、自定义各个模块

自定义模块,GItHub上有详细的官网文档,主要步骤可以分为如下:

1、复制代码(大部分都是通过修改他俩的代码来实现自定义一些功能 我们要的功能基本都在 lib/features/ 或者 lib/core/ 以及 lib/draw/)

2、修改或新增你所需要的功能

3、发布服务(以唯一的名字发布module)

4、初始化的时候引入module

在此仅提供地址。主要说明一些BMPN内部的东西。

 bpmn-js 建立在两个重要的库之上:diagram-js 和 bpmn-moddle。

图交互/建模(diagram-js)

在内部,diagram-js 使用依赖注入(DI)来连接和发现图组件。该机制建立在 didi 之上。下面显示了一个与生命周期事件挂钩的服务。它通过另一个标准服务工具 eventBus 注册一个事件:

function MyLoggingPlugin(eventBus) {
  eventBus.on('element.changed', function(event) {
    console.log('element ', event.element, ' changed')
  })
}
// ensure the dependency names are still available after minification
MyLoggingPlugin.$inject = ['eventBus']

我们必须要用模块定义以唯一的名称发布服务

import CoreModule from 'diagram-js/lib/core'
// export as module
export default {
  __depends__: [CoreModule], // {2}
  __init__: ['myLoggingPlugin'], // {3}
  myLoggingPlugin: ['type', MyLoggingPlugin] // {1}
}

该定义告诉 DI 基础设施,该服务称为 myloggingpluging{1},它依赖于 diagram-js 核心模块{2},并且应在创建关系图时初始化该服务{3}。有关更多详细信息,请参阅 didi 文档。

现在我们就可以在初始化module的时候传递我们的自定义模块

import MyLoggingModule from 'path-to-my-logging-module'
var diagram = new Diagram({
  modules: [MyLoggingModule]  // 可根据自己的要求换成上述提到的additionalModules参数。
})