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

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

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

//固定分组初始化
initStencil (graph, stencil) {
//defaultGroup是固定分组和其节点信息,自行添加defaultGroup.forEach((gp, index) => {const groupName = 'common-group' + indexconst group = { name: groupName, title: gp.name || '未命名', collapsable: true }stencil.addGroup(group)const nodes = gp.children.map(item => {let nodeif (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' + indexconst 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} = itemconst 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' + indexconst 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} = itemconst 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 + 18stencil.resizeGroup(name, { height })})}, 500)
}initStencil (stencilContainer) {const that = thisconst 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.rhkb.cn/news/209591.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu Server 20.04.6安装Anaconda3

下载安装包 去下面的网页找到自己想要安装的对应版本的链接: https://repo.anaconda.com/archive/ 我安装的版本链接如下: https://repo.anaconda.com/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 复制这个链接后使用如下命令下载: wget …

国内的几款强大的AI智能—AI语言模型

R5Ai智能助手是一款由百度研发的文心一言,它支持gpt4 / gpt-3.5 / claude,也支持AI绘画,每天提供十次免费使用机会,无需魔法。该智能助手具有以下优点:会画画,没有使用次数限制,可以在界面上找到…

YOLOv8改进 | 2023 | 通过RFAConv重塑空间注意力(深度学习的前沿突破)

一、本文介绍 本文给大家带来的改进机制是RFAConv,全称为Receptive-Field Attention Convolution,是一种全新的空间注意力机制。与传统的空间注意力方法相比,RFAConv能够更有效地处理图像中的细节和复杂模式(适用于所有的检测对象都有一定的…

矩阵元素求和:按行、按列、所有元素np.einsum()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 矩阵元素求和: 按行、按列、所有元素 np.einsum() [太阳]选择题 下列说法正确的是: import numpy as np A np.array([[1, 2],[3, 4]]) print("【显示】A") p…

修改TV app卸载页面选中样式(GuidedStepFragment)

1.源码位置 packages\apps\PackageInstaller2.解决方案 1.继承Theme.Leanback.GuidedStep <style name"Theme.Settings.GuidedStep" parent"style/Theme.Leanback.GuidedStep"><item name"guidedStepBackground">color/settings_…

新手零基础学习彩铅画,彩铅快速入门教程合集

一、教程描述 画画是很美好的一件事情&#xff0c;你可以把你想到的&#xff0c;或者看到的都画下来&#xff0c;照相机可以拍下任何你看到的&#xff0c;但是你想到的任何事物&#xff0c;只能通过绘画的方式来表达。本套教程是非常不错的&#xff0c;彩铅的小视频教程&#…

动手学深度学习笔记

1. 深度学习基础与MLP 1.1 框架&#xff1a; 线性回归&#xff1b; Softmax回归&#xff08;实际上用于分类问题&#xff09;&#xff1b; 感知机与多层感知机&#xff1b; 模型选择&#xff1b; 权重衰退&#xff08;weight decay&#xff09;&#xff1b; 丢弃法&…

es6 语法 解构 拼接 扩展运算 数组降为 symbol 迭代器 生成器 定时器 map 映射 对象字面量 私有属性 构造函数继承

es6 语法 解构 拼接 扩展运算 数组降为 symbol 迭代器 生成器 定时器 map 映射 对象字面量 私有属性 构造函数继承 promise async await 解构 // 解构var character {name:Brucezzz,pseudonym:Bruce,metadata:{age:32,gender:male,airbags: "说两句啊",airconditio…

深入理解Zookeeper系列-4.Watcher原理

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

【LeetCode热题100】【双指针】盛最多水的容器

给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示例…

如何往excel中写子表?

with pd.ExcelWriter("C:/last_date.xlsx") as writer:for i in range(0, 10):df pd.DataFrame()df.to_excel(writer, indexFalse, sheet_namestr(days[i 1]))

【高效开发工具系列】gson入门使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

医院不良事件报告系统源码带鱼骨图分析

医院不良事件上报系统通过 “事前的人员知识培训管理和制度落地促进”、“事中的事件上报和跟进处理”、 以及 “事后的原因分析和工作持续优化”&#xff0c;结合预存上百套已正在使用的模板&#xff0c;帮助医院从对护理事件、药品事件、医疗器械事件、医院感染事件、输血事件…

肺癌二期治疗效果与方案

肺腺癌II期治疗方案主要包括手术治疗、化疗、放疗等&#xff0c;建议患者积极配合医生治疗。 1、手术治疗 肺腺癌属于肺部恶性肿瘤&#xff0c;生长速度比较缓慢&#xff0c;早期患者可以通过手术的方式切除病变部位&#xff0c;能够达到根治目的&#xff0c;术后患者要注意伤…

CTF特训日记day3

复现一下RWCTF5th shellfind题目 题目描述如下&#xff1a; Hello Hacker. You dont know me, but I know you. I want to play a game. Heres what happens if you lose. The device you are watching is hooked into your Saturday and Sunday. When the timer in the back …

没有哈希时间锁定合约的跨链原子交换

在上一篇文章中&#xff0c;我们介绍了使用哈希时间锁定合约&#xff08;HTLC&#xff09;的跨链原子交换实现。 今天&#xff0c;我们介绍一种无需 HTLC 即可实现的替代方法。 这将原子交换扩展到缺乏哈希锁和时间锁的区块链。 使用 SPV 证明交易已被挖掘 让我们按照商定的价…

支撑材料-软件项目质量保证措施-资料大全

一、 质量保障措施 二、 项目质量管理保障措施 &#xff08;一&#xff09; 资深的质量经理与质保组 &#xff08;二&#xff09; 全程参与的质量经理 &#xff08;三&#xff09; 合理的质量控制流程 1&#xff0e; 质量管理规范&#xff1a; 2&#xff0e; 加强协调管理…

【23-24 秋学期】NNDL 作业11 LSTM

习题6-4 推导LSTM网络中参数的梯度&#xff0c; 并分析其避免梯度消失的效果 习题6-3P 编程实现下图LSTM运行过程 李宏毅机器学习笔记&#xff1a;RNN循环神经网络_李宏毅rnn笔记_ZEERO~的博客-CSDN博客https://blog.csdn.net/weixin_43249038/article/details/132650998 L5W…

Spring-AOP与声明式事务

为什么要用AOP ①现有代码缺陷 针对带日志功能的实现类&#xff0c;我们发现有如下缺陷&#xff1a; 对核心业务功能有干扰&#xff0c;导致程序员在开发核心业务功能时分散了精力 附加功能分散在各个业务功能方法中&#xff0c;不利于统一维护 ②解决思路 解决这两个问题&…