用通义灵码帮助实现校验bpmn.js当前画布上只能有一个开始节点的功能

news2024/11/7 10:38:15

最终代码:

     const elementRegistry = this.bpmnModeler.get('elementRegistry');

      // 获取所有元素
      const allElements = elementRegistry.getAll();

      // 过滤出开始节点
      const startEvents = allElements.filter(element => element.type === 'bpmn:StartEvent');

      // 校验开始节点的数量
      if (startEvents.length !== 1) {
        alert('画布上必须且只能有一个开始节点');
        return;
      }

实现过程:

我:bpmn.js如何实现校验当前画布上只能有一个开始节点

通义灵码:

要在 bpmn.js 中实现校验当前画布上只能有一个开始节点,可以在 saveFlow 方法中进行检查。以下是一个示例代码,展示了如何实现这一功能:

  1. 获取所有元素:使用 modeling 服务获取当前画布上的所有元素。
  2. 过滤开始节点:从所有元素中过滤出开始节点。
  3. 校验数量:检查开始节点的数量是否为1。
<template>
  <div id="app">
    <!-- 你的 BPMN 画布和其他组件 -->
  </div>
</template>

<script>
import BpmnModeler from 'bpmn-js/lib/Modeler';
import propertiesPanelModule from 'bpmn-js-properties-panel';
import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda';

export default {
  data() {
    return {
      bpmnModeler: null,
    };
  },
  mounted() {
    this.initBpmnModeler();
  },
  methods: {
    initBpmnModeler() {
      this.bpmnModeler = new BpmnModeler({
        container: '#app',
        additionalModules: [
          propertiesPanelModule,
          propertiesProviderModule
        ]
      });

      // 加载你的 BPMN 文件
      this.bpmnModeler.importXML(yourBpmnXml, (err) => {
        if (err) {
          console.error('Failed to load BPMN file', err);
        } else {
          console.log('BPMN file loaded successfully');
        }
      });
    },
    saveFlow() {
      const { modeling, elementRegistry } = this.bpmnModeler.get('modeling');

      // 获取所有元素
      const allElements = elementRegistry.getAll();

      // 过滤出开始节点
      const startEvents = allElements.filter(element => element.type === 'bpmn:StartEvent');

      // 校验开始节点的数量
      if (startEvents.length !== 1) {
        alert('画布上必须且只能有一个开始节点');
        return;
      }

      // 如果校验通过,继续保存流程
      this.bpmnModeler.saveXML({ format: true }, (err, { xml }) => {
        if (err) {
          console.error('Failed to save BPMN file', err);
        } else {
          console.log('BPMN file saved successfully', xml);
          // 你可以在这里将 XML 发送到服务器
        }
      });
    }
  }
};
</script>

<style>
/* 你的样式 */
</style>

解释

  1. 初始化 BpmnModeler
    • 在 mounted 生命周期钩子中初始化 BpmnModeler,并加载 BPMN 文件。
  2. saveFlow 方法
    • 获取 modeling 和 elementRegistry 服务。
    • 使用 elementRegistry.getAll() 获取画布上的所有元素。
    • 使用 filter 方法过滤出类型为 bpmn:StartEvent 的元素。
    • 检查过滤后的数组长度是否为1,如果不是,则弹出提示并返回。
    • 如果校验通过,调用 saveXML 方法保存 BPMN 文件。

这样,你就可以确保在保存流程之前,画布上只有一个开始节点。

我:报错:TypeError: Cannot read properties of undefined (reading 'getAll')

通义灵码:

报错 TypeError: Cannot read properties of undefined (reading 'getAll') 表明 elementRegistry 未正确获取到。这通常是因为 get 方法没有正确地从 bpmnModeler 中获取到 elementRegistry 服务。

我们可以通过以下步骤来解决这个问题:

  1. 确保 bpmnModeler 已经初始化完成
  2. 正确获取 elementRegistry 服务

以下是修正后的代码:

<template>
  <div id="app">
    <!-- 你的 BPMN 画布和其他组件 -->
  </div>
</template>

<script>
import BpmnModeler from 'bpmn-js/lib/Modeler';
import propertiesPanelModule from 'bpmn-js-properties-panel';
import propertiesProviderModule from 'bpmn-js-properties-panel/lib/provider/camunda';

export default {
  data() {
    return {
      bpmnModeler: null,
    };
  },
  mounted() {
    this.initBpmnModeler();
  },
  methods: {
    initBpmnModeler() {
      this.bpmnModeler = new BpmnModeler({
        container: '#app',
        additionalModules: [
          propertiesPanelModule,
          propertiesProviderModule
        ]
      });

      // 加载你的 BPMN 文件
      this.bpmnModeler.importXML(yourBpmnXml, (err) => {
        if (err) {
          console.error('Failed to load BPMN file', err);
        } else {
          console.log('BPMN file loaded successfully');
        }
      });
    },
    saveFlow() {
      // 确保 bpmnModeler 已经初始化
      if (!this.bpmnModeler) {
        console.error('BPMN Modeler is not initialized');
        return;
      }

      const elementRegistry = this.bpmnModeler.get('elementRegistry');

      // 获取所有元素
      const allElements = elementRegistry.getAll();

      // 过滤出开始节点
      const startEvents = allElements.filter(element => element.type === 'bpmn:StartEvent');

      // 校验开始节点的数量
      if (startEvents.length !== 1) {
        alert('画布上必须且只能有一个开始节点');
        return;
      }

      // 如果校验通过,继续保存流程
      this.bpmnModeler.saveXML({ format: true }, (err, { xml }) => {
        if (err) {
          console.error('Failed to save BPMN file', err);
        } else {
          console.log('BPMN file saved successfully', xml);
          // 你可以在这里将 XML 发送到服务器
        }
      });
    }
  }
};
</script>

<style>
/* 你的样式 */
</style>

解释

  1. 确保 bpmnModeler 已经初始化
    • 在 saveFlow 方法中,首先检查 bpmnModeler 是否已经初始化。如果没有初始化,输出错误信息并返回。
  2. 正确获取 elementRegistry 服务
    • 使用 this.bpmnModeler.get('elementRegistry') 获取 elementRegistry 服务。
  3. 获取所有元素
    • 使用 elementRegistry.getAll() 获取画布上的所有元素。
  4. 过滤开始节点
    • 使用 filter 方法过滤出类型为 bpmn:StartEvent 的元素。
  5. 校验开始节点的数量
    • 检查过滤后的数组长度是否为1,如果不是,则弹出提示并返回。
  6. 保存流程
    • 如果校验通过,调用 saveXML 方法保存 BPMN 文件。

这样可以确保 elementRegistry 服务正确获取,并且在 bpmnModeler 未初始化时不会尝试访问其属性。

修正后的代码是可用的。至此,问题解决。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2234955.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于单片机的燃气报警阀门系统

本设计基于单片机的燃气报警阀门系统&#xff0c;燃气报警阀门系统采用STM32主控制器为核心芯片&#xff0c;外围电路由燃气传感器、OLED液晶显示模块、按键模块、蜂鸣器报警模块、电磁阀以及SIM800模块等模块组成。燃气传感器模块负责采集燃气浓度数据&#xff0c;采集完成由S…

揭秘云计算 | 2、业务需求推动IT发展

揭秘云计算 | 1、云从哪里来&#xff1f;-CSDN博客https://blog.csdn.net/Ultipa/article/details/143430941?spm1001.2014.3001.5502 书接上文&#xff1a; 过去几十年间IT行业从大型主机过渡到客户端/服务器&#xff0c;再过渡到现如今的万物互联&#xff0c;IT可把控的资…

qt QItemSelectionModel详解

1、概述 QItemSelectionModel是Qt框架中提供的一个功能强大且灵活的项选择模型类。它主要用于在用户界面中管理和操作用户选定的项&#xff0c;是实现交互式和响应式应用程序的重要组件。QItemSelectionModel能够帮助开发者创建用户友好和高效的多选列表、表格数据选择等应用场…

SAP ABAP开发学习——WDA 七 使用文本与消息

目录 从数据字典读取文本 使用OTR文本 从程序中调用OTR文本 消息分类 定义消息显示位置 text类消息的使用 T100 消息的使用 OTR消息实例 消息内容修改 从数据字典读取文本 使用OTR文本 可以自己创建OTR文本 从程序中调用OTR文本 消息分类 定义消息显示位置 text类消息的…

实习作假:阿里健康实习做了RABC中台,还优化了短信发送流程

最近有二本同学说&#xff1a;“大拿老师&#xff0c;能帮忙看下简历吗&#xff1f;” 如果是从面试官的角度来看&#xff0c;这个同学的实习简历是很虚假的。 但是我们一直强调的是&#xff1a;校招的实习简历是不能出现明显的虚假。 首先&#xff0c;你去公司做事情&#…

mqtt 传递和推送 温湿度计消息 js

mqtt 传递和推送 温湿度计消息 做了一个mqtt的小网站 包括设备管理&#xff0c;订阅管理&#xff0c;连接认证订阅授权 这里我新增了一个设备 订阅组温湿度里面有两个订阅 设备详情授权给设备使用 设备连接 和之前的wifi连接一样 温湿度也和之前的使用一样 require(u…

基于Jeecgboot3.6.3vue3的flowable流程增加online表单的审批支持(一)整体思路

更多技术支持与服务请加入我的知识星球或加我微信,名称:亿事达nbcio技术交流社区https://t.zsxq.com/iPi8F 今天讲一下流程审批支持online表单,我们知道,之前的VForm3表单不支持数据库存储,自定义业务表单要求又比较高,需要自己写一些前后端的代码,那online就不需要,可以…

Git超详细笔记包含IDEA整合操作

git超详细笔记 文章目录 git超详细笔记第1章Git概述1.1、何为版本控制1.2、为什么需要版本控制1.3、版本控制工具1.4 、Git简史1.5、Git工作机制1.6 、Git和代码托管中心 第2章Git安装第3章Git常用命令3.1、设置用户签名3.2、初始化本地库本地库&#xff08;Local Repository&a…

HTML 基础标签——多媒体标签<img>、<object> 与 <embed>

文章目录 1. `<img>` 标签主要属性示例注意事项2. `<object>` 标签概述主要属性示例注意事项3. `<embed>` 标签概述主要属性示例注意事项小结在现代网页设计中,多媒体内容的使用变得越来越重要,因为它能够有效增强用户体验、吸引注意力并传达信息。HTML 提…

flutter 项目初建碰到的控制台报错无法启动问题

在第一次运行flutter时&#xff0c;会碰见一直卡在Runing Gradle task assembleDebug的问题。其实出现这个问题的原因有两个。 一&#xff1a;如果你flutter -doctor 检测都很ok&#xff0c;而且环境配置都很正确&#xff0c;那么大概率就是需要多等一会&#xff0c;少则几十分…

使用ssh-key免密登录服务器或免密连接git代码仓库网站

ssh登录服务器场景 假设有两台机器&#xff0c;分别是&#xff1a; 源机器&#xff1a;主机A&#xff08;hostA&#xff09;&#xff0c;ip&#xff1a;198.168.0.1 目标机器&#xff1a;主机B&#xff08;hostB&#xff09;&#xff0c;ip&#xff1a;192.168.0.2 ssh-key免…

初识Electron 进程通信

概述 Electron chromium nodejs native API&#xff0c;也就是将node环境和浏览器环境整合到了一起&#xff0c;这样就构成了桌面端&#xff08;chromium负责渲染、node负责操作系统API等&#xff09; 流程模型 预加载脚本&#xff1a;运行在浏览器环境下&#xff0c;但是…

小菜家教平台(三):基于SpringBoot+Vue打造一站式学习管理系统

目录 前言 今日进度 详细过程 相关知识点 前言 昨天重构了数据库并实现了登录功能&#xff0c;今天继续进行开发&#xff0c;创作不易&#xff0c;请多多支持~ 今日进度 添加过滤器、实现登出功能、实现用户授权功能校验 详细过程 一、添加过滤器 自定义过滤器作用&…

小新学习k8s第六天之pod详解

一、资源限制 Pod是k8s中的最小的资源管理组件&#xff0c;pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。k8s中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的&#xff0c;例如&#xff0c;用于管理Pod运行的StatefulSet和Deployment等…

戴尔电脑 Bios 如何进入?Dell Bios 进入 Bios 快捷键是什么?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机启动时运行的第一个程序&#xff0c;它负责初始化硬件并加载操作系统。对于戴尔电脑用户来说&#xff0c;有时可能需要进入 BIOS 进行一些特定的设置调整&#xff0c;比如更改启动顺序、调整性能选项或解决硬件兼容性问题…

【UE5】一种老派的假反射做法,可以用于移动端,或对反射的速度、清晰度有需求的地方

没想到大家这篇文章呼声还挺高 这篇文章是对它的详细实现&#xff0c;建议在阅读本篇之前&#xff0c;先浏览一下前面的文章&#xff0c;以便更好地理解和掌握内容。 这种老派的假反射技术&#xff0c;适合用于移动端或对反射效果的速度和清晰度有较高要求的场合。该技术通过一…

MongoDB笔记02-MongoDB基本常用命令

文章目录 一、前言二、数据库操作2.1 选择和创建数据库2.2 数据库的删除 3 集合操作3.1 集合的显式创建3.2 集合的隐式创建3.3 集合的删除 四、文档基本CRUD4.1 文档的插入4.1.1 单个文档插入4.1.2 批量插入 4.2 文档的基本查询4.2.1 查询所有4.2.2 投影查询&#xff08;Projec…

【启程Golang之旅】深入理解 Protocol Buffers 及其应用

如果你是 Go 语言的开发者&#xff0c;理解如何在 Go 中使用 Protobuf&#xff0c;将帮助你大幅提升数据传输的效率&#xff0c;并实现更高性能的系统设计。 本篇文章将深入探讨 Go 语言中使用 Protobuf 的基础知识、常见应用以及最佳实践&#xff0c;带你一步步了解如何在项目…

最新发布:数智人才成长引擎

数字经济时代 数智人才缺口不断增大 根据公开发布的信息显示&#xff0c;中国&#xff0c;作为全球最大的数字经济体之一&#xff0c;当前数智人才&#xff08;涵盖了数智人才、数据分析师、AI专家、云计算工程师等关键岗位&#xff09;的总体缺口已攀升至惊人的2500万至3000…

ServletContext介绍

文章目录 1、ServletContext对象介绍1_方法介绍2_用例分析 2、ServletContainerInitializer1_整体结构2_工作原理3_使用案例 3、Spring案例源码分析1_注册DispatcherServlet2_注册配置类3_SpringServletContainerInitializer 4_总结 ServletContext 表示上下文对象&#xff0c;…