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

news2024/11/18 10:52:11

问题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
}
}

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

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

相关文章

C语言——深入理解指针(5)

目录 1. sizeof和strlen的对比 1.1 sizeof 1.2 strlen 1.3 sizeof和strlen 的对比 2. 数据和指针题解析 2.1 一维数组 2.2 字符数组 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2,6 2.3 二维数组 3. 指针运算题解析 3.1 例1 3.2 例2 3.3 例3 3.4 例4 3.5 例5 3.6 例…

DSShop移动商城网店系统 反序列化RCE漏洞复现

0x01 产品简介 DSShop是长沙德尚网络科技有限公司推出的一款单店铺移动商城网店系统,能够帮助企业和个人快速构建手机移动商城,并减少二次开发带来的成本。 以其丰富的营销功能,精细化的用户运营,解决电商引流、推广难题,帮助企业打造生态级B2C盈利模式商业平台。完备的电商…

EasyRecovery2024免费永久版手机数据恢复软件

EasyRecovery2024是一款操作安全、用户可自主操作的数据恢复方案,它支持从各种各样的存储介质恢复删除或者丢失的文件,其支持的媒体介质包括:硬盘驱动器、光驱、闪存、硬盘、光盘、U盘/移动硬盘、数码相机、手机以及其它多媒体移动设备。能恢…

将.tiff格式图片转换为可视化的png,jpg,bmp等格式(附代码)

目前常用的.tiff格式图片转png格式图片,搜了一下,多数都是第三方平台直接转换,需要米,其实大可不必,自己撸代码就可以直接转换。 TIFF(Tagged Image File Format)是一种灵活的位图格式&#xf…

探索人工智能领域——每日20个名词详解【day7】

目录 前言 正文 总结 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于CSDN📚。 📣如需转载,请事先与我联系以…

YITH Product Countdown Premium电商商城产品倒计时高级版插件

点击阅读YITH Product Countdown Premium电商商城产品倒计时高级版插件原文 YITH Product Countdown Premium电商商城产品倒计时高级版插件的作用通过显示优惠的剩余时间或特定产品的可用数量的倒计时来促进销售。 您如何从中受益: 您可以利用稀缺性原则来增加转…

Open Inventor 2023.2.1 Crack

Fixed Bugs List 2023.2 2023.2.1 Open Inventor 2023.2.1 MeshViz #OIV-4824 Crash in MeshViz PbNonLinearDataMapping::computeColor Cache #OIV-4867 SoText3 : Texture read access violation – CAS-44904 Core #OIV-4725 Invalid displayed PoCircle color…

虹科案例 | OPC UA SDK快速扩展VIMANA智能制造软件连接性

导读: 虹科Matrikon在为OPC兼容性构建软件方面享有盛誉,VIMANA也因此选择使用我们的FLEX OPC UA SDK来快速扩展其智能制造软件的连接性,从而使用户能够“收听”其所有兼容OPC UA的设备,本篇案例文章将带你了解OPC UA SDK的现实应用…

《python每天一小段》--(2)使用Paramiko库,批量操作linux服务器

使用Paramiko库,批量操作多Linux服务器 使用Paramiko库建立SSH连接并执行命令获取多个Linux服务器的磁盘信息。通过这个例子,你可以学习到如何使用Python自动化操作远程服务器。 操作如图: 查看了两台服务器的磁盘容量: 安装模…

【电路笔记】-电阻器额定功率

电阻器额定功率 文章目录 电阻器额定功率1、概述2、电阻功率(P)3、功率电阻器4、电阻器额定功率示例15、电阻器额定功率示例2 电能被电阻吸收,因为它是电压和电流的乘积,一些电阻将这种电能转化为热量。 1、概述 当电流由于电阻器…

正则表达式(3):入门

正则表达式(3):入门 小结 本博文转载自 从这篇文章开始,我们将介绍怎样在Linux中使用”正则表达式”,如果你想要学习怎样在Linux中使用正则表达式,这些文章就是你所需要的。 在认识”正则表达式”之前&am…

【unity3D】unity中如何查找和获取游戏物体

💗 未来的游戏开发程序媛,现在的努力学习菜鸡 💦本专栏是我关于游戏开发的学习笔记 🈶本篇是unity中游戏物体的查找与获取 这里写自定义目录标题 获取当前物体的基本属性查找其它物体- 通过名称查找其它物体- 通过标签查找- 通过类…

微信开发者工具里面模拟操作返回、录屏、网络速度、截屏等操作

有时候可能因为自己开发的页面使用了自定义的样式,所以没有了左上角的导航返回,所以进入我自定义的页面后,想要返回的话,就可以用到这里面你的操作,或者想截屏了也可以直接使用里面的截屏,或者返回主页面等…

如何有效进行测试执行进度计划

测试执行通常都是处于软件测试生命周期的关键路径上,它不仅在测试过程中占有重要的地位,并且也会花费大量的测试时间。针对测试执行而进行的计划,即测试执行进度计划,是进行测试执行进度控制的基础。在进行测试执行进度计划制订的…

龙迅分配器LT86102UXE/LT86104UX,HDMI一分二/HDMI一分四

龙迅LT86102UXE描述; Lontium LT86102UXE HDMI2.0分配器具有1:2的分配器,符合HDMI2.0/1.4规范,最大6Gbps高速数据速率,自适应均衡RX输入和预先强调的TX输出,以支持长电缆应用程序,内部TX通道交换灵活的PCB…

C++进阶篇6---lambda表达式

目录 一、lambda表达式 1.引入 2、lambda表达式语法 二、包装器---function 1.引入 2.包装器介绍 三、bind 一、lambda表达式 1.引入 class Person { public:Person(int age,string name):_age(age),_name(name){} //private://方便后面的举例int _age;string _name…

全网最新最全的自动化测试教程:python+pytest接口自动化(9)-cookie绕过登录(保持登录状态

在编写接口自动化测试用例或其他脚本的过程中,经常会遇到需要绕过用户名/密码或验证码登录,去请求接口的情况,一是因为有时验证码会比较复杂,比如有些图形验证码,难以通过接口的方式去处理;再者&#xff0c…

【openssl】RSA 生成公钥私钥 |通过私钥获取公钥

通过博客:Window系统如何编译openssl 编译出openssl.exe(位于apps文件夹下)。 现在需要使用它获得公钥私钥、通过私钥获取公钥 目录 说明!!! 一.定位openssl.exe目录 二、进入命令cmd 三、生成私钥 …

知虾数据工具:助力Shopee商家实现数据化运营的有力助手

在如今竞争激烈的电商市场中,了解市场趋势、优化产品和店铺运营、了解竞争对手等是商家取得成功的关键。而针对Shopee平台的知虾数据工具则为商家和市场分析师提供了一个强大的数据分析工具。本文将介绍知虾数据工具的主要功能,包括多站点数据分析、行业…

抖音视频水印怎么去除?这三个视频去水印技巧值得收藏!

抖音视频水印怎么去除?随着互联网的持续发展,越来越多的人选择使用视频分享平台来展示他们的生活与工作。然而,上传到这些平台上的许多视频常常遭到恶意水印的攻击,严重影响了观众的观看体验。今天,我们将分享三个视频…