antv x6填坑指南: 部分节点拖拽和操作撤销重做不生效问题、使用Stencil过滤时过滤后分组的显示高度无法根据过滤节点自适应问题

问题1. 部分分组中节点拖拽添加或操作后撤销重做操作不生效。

前提:使用Stencil插件,创建画布侧边栏的 UI 组件,同时使用其分组、折叠能力。分组包含固定分组、后台接口获取的动态分组和组件。

//固定分组初始化
initStencil (graph, stencil) {
//defaultGroup是固定分组和其节点信息,自行添加
      defaultGroup.forEach((gp, index) => {
        const groupName = 'common-group' + index
        const group = { name: groupName, title: gp.name || '未命名', collapsable: true }
        stencil.addGroup(group)
        const nodes = gp.children.map(item => {
          let node
          if (item.data.nodeType !== specilNodeType.GroupNodeType) {
            node = graph.createNode({
              shape: 'custom-vue-node',
              width: 166,
              height: 32,
              data: { nodeGroup: gp.key, ...item, ...(item.data || {}), isStencil: true, data: null }
            })
          } else {
            node = graph.createNode({
              shape: 'group-vue-node',
              width: 166,
              height: 32,
              data: { nodeGroup: gp.key, ...item, ...(item.data || {}), isStencil: true, data: null }
            })
          }

          return node
        })
        stencil.load(nodes, groupName)
      })
      // 重要,动态添加分组后手动调用一下startListening,否则新增的分组无法监听鼠标按下事件
      stencil.startListening()
    },
    //动态分组创建
    createStencilNode (graph, stencil, componentList) {
      Object.keys(componentList).forEach((key, index) => {
        const groupName = 'group' + index
        const group = { name: groupName, title: key || '未命名', collapsable: true }
        stencil.addGroup(group)
        const nodes = componentList[key].map(item => {
          const {
            abilityParamList = [],
            serviceName = '未知',
            productType,
            resType,
            serviceId,
            serviceType,
            serviceDescription,
            tags,
            icon, priority

          } = item
        
          const node = graph.createNode({
            shape: 'custom-vue-node',
            width: 166,
            height: 32,
            data: {
              name: serviceName,
              icon,
              nodeGroup: key, // 分组
              productType,
              resType,
              serviceId,
              serviceType,
              serviceDescription,
              tags,
              priority,
              strategyConfig: [],
              isStencil: true
            }
          })
          return node
        })
        stencil.load(nodes, groupName)
      })
      // 重要,动态添加分组后手动调用一下startListening,否则新增的分组无法监听鼠标按下事件
      stencil.startListening()
    },

**问题:**固定分组中的节点拖拽入画布后画布的撤销重做操作无法使用,如果不拖拽加入固定分组中的节点,撤销重做操作正常。
解决:
由于固定分组是画图初始化完就添加的,而动态分组时后面通过接口返回添加的,为了避免新增的分组无法监听鼠标按下事件,固分别执行了stencil.startListening()方法。导致固定分组中执行了两个监听。固在第二次执行该方法前,调用stencil.stopListening()取消之前的监听事件,这里添加在动态创建分组方法中

 //动态分组创建
    createStencilNode (graph, stencil, componentList) {
    // 避免之前初始化的侧边节点拖拽后无法使用撤销重做操作问题
      stencil.stopListening()
      Object.keys(componentList).forEach((key, index) => {
        const groupName = 'group' + index
        const group = { name: groupName, title: key || '未命名', collapsable: true }
        stencil.addGroup(group)
        const nodes = componentList[key].map(item => {
          const {
            abilityParamList = [],
            serviceName = '未知',
            productType,
            resType,
            serviceId,
            serviceType,
            serviceDescription,
            tags,
            icon, priority

          } = item
        
          const node = graph.createNode({
            shape: 'custom-vue-node',
            width: 166,
            height: 32,
            data: {
              name: serviceName,
              icon,
              nodeGroup: key, // 分组
              productType,
              resType,
              serviceId,
              serviceType,
              serviceDescription,
              tags,
              priority,
              strategyConfig: [],
              isStencil: true
            }
          })
          return node
        })
        stencil.load(nodes, groupName)
      })
      // 重要,动态添加分组后手动调用一下startListening,否则新增的分组无法监听鼠标按下事件
      stencil.startListening()
    },

问题2、使用Stencil的过滤能力时,过滤后分组高度无法根据过滤后的组件自适应。仍然保持过滤前的高度

前提: 使用Stencil插件的过滤功能
问题: Stencil中分组容器的高度在加载分组时就确定了。后面不会根据里面的节点个数改变,且里面的节点是通过svg标签包裹的,没办法动态设置其高度。
过滤前:
在这里插入图片描述
过滤后:
在这里插入图片描述

解决: 在过滤方法中为满足过滤条件的节点添加一个属性设置其为true,最后获取分组中包含该属性的节点,即过滤展示的节点,根据节点个数动态设置分组的高度。

import { Stencil } from '@antv/x6-plugin-stencil'
export default class GraphFlow {
//其他方法自行定义
 graph;
 stencil;
 timer;
refreshStencilHeight (model, stencil) {
  if (this.timer) {
    clearTimeout(this.timer)
  }
  this.timer = setTimeout(() => {
    Object.keys(model.groups).forEach(name => {
      const nodes = model.graphs?.[name]?.model?.getNodes() || []
      const index = nodes.filter(it => {
        return it.getData()?.isMatched
      })
      const height = index.length * 36 + 18
      stencil.resizeGroup(name, { height })
    })
  }, 500)
}

initStencil (stencilContainer) {
  const that = this
  const stencil = new Stencil({
    title: '',
    target: this.graph,
    search (cell, keyword) {
      const { name } = cell.getData() || {}
      that.refreshStencilHeight(this, stencil)
      if (name && name.indexOf(keyword) !== -1) {
        // 标识过滤匹配成功,解决过滤后分组高度显示无法自适应问题
        cell.setData({ isMatched: true })
      }
      return name && name.indexOf(keyword) !== -1
    },
    placeholder: '请输入',
    notFoundText: '暂无数据',
    stencilGraphWidth: 200, // 组宽度
    stencilGraphHeight: 0, // 模板画布高度。设置为 0 时高度会自适应
    // collapsable: true, // 如果不设置则第一个group的title显示不出来
    groups: [
    ],
    layoutOptions: {
      columns: 1,
      columnWidth: 180, // 这个值要和group的值对应要不然可能会定位不准确
      rowHeight: 36, // 行高,会影响节点之间的高度间隔
      resizeToFit: true
    }
  })

  stencilContainer.appendChild(stencil.container)
  this.stencil = stencil
}
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis中缓存穿透、击穿、雪崩以及解决方案

目录 一、Redis 介绍 二、Redis 缓存穿透 三、Redis 缓存击穿 四、Redis 缓存雪崩 一、Redis 介绍 Redis(Remote Dictionary Server)是一个开源的内存数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种数据结构&#xf…

centos7防火墙开启端口

1.查看防火墙状态 firewall-cmd --state如果返回的not running,那么需要先开启防火墙 2.开启关闭防火墙 systemctl start firewalld.service systemctl stop firewalld.service systemctl restart firewalld.service3.开放指定端口 firewall-cmd --zonepublic -…

对点云进行凸包提取

void getConcaveHull(PointCloud::Ptr& cloud,const pcl::PointCloud<PointXYZ>::Ptr &hull) {if(cloud->points.size()<3){return ;}PointCloud ::Ptr cloud_filtered(new PointCloud());downSample(cloud,cloud_filtered);// 创建凹包提取对象pcl::Conca…

人工智能学习3(特征变换)

编译工具&#xff1a;PyCharm 有些编译工具不用写print可以直接将数据打印出来&#xff0c;pycharm需要写print才会打印出来。 概念 1.特征类型 特征的类型&#xff1a;“离散型”和“连续型” 机器学习算法对特征的类型是有要求的&#xff0c;不是任意类型的特征都可以随意…

重塑生成式AI时代数据战略,亚马逊云科技re:Invent大会Swami主题演讲

re:lnvent 2023 Swami Sivasubramanian主题演讲&#xff0c;数据、AI和人类共进共生&#xff0c;重塑生成式AI时代的数据战略。 赋能人才加持生成式AI必备能 生成式AI创新中心&#xff1a;解决生成式AI工程化挑战。 Amazon Bedrock平台PartyRock&#xff1a;生成式AI应用程序实…

Docker Registry本地镜像仓库部署并实现远程连接拉取镜像

Linux 本地 Docker Registry本地镜像仓库远程连接 文章目录 Linux 本地 Docker Registry本地镜像仓库远程连接1. 部署Docker Registry2. 本地测试推送镜像3. Linux 安装cpolar4. 配置Docker Registry公网访问地址5. 公网远程推送Docker Registry6. 固定Docker Registry公网地址…

【往届均已IEEE出版,EI检索】 第五届计算机工程与应用国际学术会议 (ICCEA 2024)

第五届计算机工程与应用国际学术会议 (ICCEA 2024) 2024 5th International Conference on Computer Engineering and Application 计算机工程与应用在人工智能、大数据、云计算、物联网、网络安全等领域发挥着重要作用&#xff0c;随着科技日益进步&#xff0c;该领域的研究…

Python 潮流周刊#29:Rust 会比 Python 慢?!

△请给“Python猫”加星标 &#xff0c;以免错过文章推送 你好&#xff0c;我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容&#xff0c;大部分为英文。本周刊开源&#xff0c;欢迎投稿[1]。另有电报频道[2]作为副刊&#xff0c;补充发布更加丰富的资讯。 &#x1f43…

云原生之深入解析Kubernetes策略引擎对比:OPA/Gatekeeper与Kyverno

一、前言 ① Kubernetes 策略 Kubernetes 的 Pod Security Policy&#xff0c;正如其名字所暗示的&#xff0c;仅是针对 Pod 工作的&#xff0c;是一种用来验证和控制 Pod 及其属性的机制。另外 PSP 只能屏蔽非法 Pod 的创建&#xff0c;无法执行任何补救/纠正措施。而 Gatek…

ApachePOI入门案例——读取Excel文件的内容

依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version> </dependency> <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml…

一、Zookeeper基本知识

目录 1、ZooKeeper概述 2、ZooKeeper特性 3、ZooKeeper集群角色 ​​​​​​​1、ZooKeeper概述 Zookeeper是一个分布式协调服务的开源框架。主要用来解决分布式集群中应用系统的一致性问题。 ZooKeeper本质上是一个分布式的小文件存储系统。提供基于类似于文件系统的目录…

【华为OD题库-049】评论转换输出-java

题目 在一个博客网站上&#xff0c;每篇博客都有评论。每一条评论都是一个非空英文字母字符串。评论具有树状结构&#xff0c;除了根评论外&#xff0c;每个评论都有一个父评论。 当评论保存时&#xff0c;使用以下格式: 首先是评论的内容; 然后是回复当前评论的数量。 最后是当…

05、pytest断言确定的异常

官方用例 # content of test_sysexit.py import pytestdef f():raise SystemExit(1)def test_mytest():with pytest.raises(SystemExit):f()解读与实操 ​ 标准python raise函数可产生异常。pytest.raises可以断言某个异常会发现。异常发生了&#xff0c;用例执行成功&#x…

华为云云绘本第一期:童话奇迹原来是你

点此进入官网&#xff0c;专家1对1&#xff1a;应用身份管理服务OneAccess_华为云IDaaS-华为云

Python:核心知识点整理大全2-笔记

在本章中&#xff0c;你将学习可在Python程序中使用的各种数据&#xff0c;还将学 习如何将数据存储到变量中&#xff0c;以及如何在程序中使用这些变量。 2.1 运行 hello_world.py 时发生的情况 运行hello_world.py时&#xff0c;Python都做了些什么呢&#xff1f;下面来深入…

ArcGIS提取DEM中的山脉范围

已知数据&#xff1a;DEM文件ASTGTM_N00E118E.img 使用软件&#xff1a;ArcMap 要求&#xff1a;对数据进行操作&#xff0c;提取数据文件中的山脉范围 下面开始操作&#xff1a; 1、 打开ArcMap将DEM文件ASTGTM_N00E118E.img添加到数据框。 2、 接下来我们打开spatial ana…

三十七、XA模式

目录 一、XA模式原理 在XA模式中&#xff0c;一个事务通常被分为两个阶段&#xff1a; 二、Seata的XA模式 RM一阶段的工作&#xff1a; TC一阶段的工作&#xff1a; RM二阶段的工作&#xff1a; 1、优点&#xff1a; 2、缺点&#xff1a; 三、实现XA模式 1、修改yml文…

CYCA少儿形体礼仪 朝阳市培训成果考核圆满落幕

少年成长从形体教育开始——从2020年美育中考落地执行开始&#xff0c;美育成为少儿教育发展的必经之路&#xff0c;助力少儿综合能力全面发展。CYCA中国文化管理协会青少年文化艺术委员会全面贯彻党的教育方针&#xff0c;促进儿童素质艺术教育并深入实施&#xff0c;从少儿形…

12-2 Mybatis-Plus与Spring整合

user-springboot programming 实体类 ## 链接数据源 C3p0&#xff08;原始化&#xff09; 连接池的数据源 引入mysql 自动配置类DataSource会生效 需要你去配置相关的数据库参数 需要用到连接池 数据源的配置类 SpringBoot的测试类 SpringBootTest 原先是RunWith和Conf…

服务异步通讯

四、服务异步通讯 4.1初始MQ 4.1.1同步通讯和异步通讯 同步调用的优点: 时效性较强,可以立即得到结果 同步调用的问题: 耦合度高 性能和吞吐能力下降 有额外的资源消耗 有级联失败问题 异步通信的优点: 耦合度低 吞吐量提升 故障隔离 流量削峰 异步通信的缺点: …