cmmnjs的前端实践:4、节点的更改和删除

70 阅读1分钟

在前端开发中,cmmnjs模型和bpmnjs模型有许多类似可参照的地方,本文聚焦于cmmnjs的使用,与bpmn中类似的点将不做赘述。主要说明cmmn和bpmn的不同之处和节点的相关操作。

示例:项目地址 ,基于vue实现,但cmmnjs相关逻辑与框架无关,可直接迁移至其它框架。

代码中涉及到功能模块的部分,将直接以对应模块名称代替,实际开发时需要通过cmmnModeler.get('模块名')获取。

一、用新节点替换旧节点

在画布上创建好节点后,如果想用新节点替换旧节点,可以使用modeling.replaceShape方法。

    // 获取旧节点 创建新节点
    let oldShape = elementRegistry.get(id)
    let newShape = elementFactory.createPlanItemShape("cmmn:DecisionTask");
    // 指定newShape的位置,不指定会因为找不到节点位置而报错
    newShape.x = oldShape.x + newShape.width / 2;
    newShape.y = oldShape.y + newShape.height / 2;
    // 传递oldShape中需要保留的值,注意不要替换掉newShape.businessObject.definitionRef定义本身
    newShape.businessObject.definitionRef.name =
      oldShape.businessObject?.definitionRef?.name;
    modeling.replaceShape(oldShape, newShape);

二、改变节点属性/渲染形状

在cmmn中,可以通过自定义渲染模块renderer来自定义节点形状,与bpmn类似。 可能也会出现,在节点已经渲染完成后,又需要改变节点渲染形状的情况。 如果只需要改变样式,比如改变颜色,可以通过

    const gfx = elementRegistry.getGraphics(shape)
    gfx.style.fill = 'blue';
    gfx.style.stroke = 'red';

或添加类名

    canvas.addMarker(shape.id, 'highlight')

bpmn中可以通过modeling.setColor来更改节点颜色,cmmn中没有对应函数,需要手动实现。 如果有比较大的形状变动,不能通过改变样式实现时,可以使用modeling.updateProperties方法更新节点属性,以触发节点的重新渲染,在自定义渲染函数中实现新的形状渲染方法。

三、删除节点

// 参数为数组,可以一次删除多个节点
modeling.removeElements([shape])