前端gojs中禁用指定节点的选中效果

news2024/11/28 1:46:05

代码思路

适用于禁用某些节点的选中状态,选中节点时判断该节点要不要禁用

点击节点的时候,判断节点要不要禁用选中效果
如果禁用,就在选中时,把选中节点重置为最近一次非禁用的节点
diagram.select:选中节点
diagram.findNodeForKey(id):根据id获取节点信息
node.wb 获取节点基本信息(此示例版本gojs中,node.wb可获取节点信息)

页面截图

在这里插入图片描述

效果演示

此示例效果中
1.默认选中节点:根节点
2.不可选中节点3个:节点1、节点2、节点3
3.可选中节点3个:节点4、节点5、节点6

gojs节点禁用选中状态

关键代码块

1.diagram.nodeTemplate设置name标识
2.通过selectionAdorned取消选中时的边框
3.添加选中事件selectionChanged

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>gojs</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/gojs/2.3.5/go.js"></script>
    <style>
        #myDiagramDiv {
            width: 100%;
            height: 900px;
            background-color: #DAE4E4;
        }
    </style>
</head>
<body>
    <div id="myDiagramDiv"></div>
</body>
<script>
    var $ = go.GraphObject.make;
    var nodeDataArray = [
        // type:自己定义的字段
        //      isCheck: 在这里表示是否可以选中
        { key: "start", text: '根节点', type: 'isCheck'},
        { key: "1", text: '节点1', parent: 'start', type: ''},
        { key: "2", text: '节点2', parent: 'start', type: ''},
        { key: "3", text: '节点3', parent: 'start', type: ''},
        { key: "4", text: '节点4', parent: 'start', type: 'isCheck'},
        { key: "5", text: '节点5', parent: 'start', type: 'isCheck'},
        { key: "6", text: '节点6', parent: 'start', type: 'isCheck'},
    ];
    var linkDatasArray = [
        {from: 'start', to: '1'},
        {from: 'start', to: '2'},
        {from: 'start', to: '3'},
        {from: 'start', to: '4'},
        {from: 'start', to: '5'},
        {from: 'start', to: '6'},
    ]

    var diagram = $(go.Diagram, "myDiagramDiv", {
        layout: $(go.TreeLayout, {
            angle: 90,
            nodeSpacing: 20,
            layerSpacing: 70
        }),
        isReadOnly: true, // 是否禁用节点编辑
    });
    
    /** 节点点击 */
    function nodeClicked(e, node){
        if(node.wb.type=='isCheck'){
            console.log('节点点击')
        }
    }

    /** 节点选中 */
    let defaultSelectId = ''//记录最后一次选中的节点
    const onSelectionChanged=(node)=>{
        var icon = node.findObject('Icon')
        if(icon!==null){
            if(node.isSelected){//选中
                icon.fill = '#ff4040'//背景色
                icon.stroke = '#fff'//边框色
                
                // 本版本gojs中node.wb可以获取节点信息
                if(node.wb.type=='isCheck'){
                    // 如果节点可以选择就记录该节点
                    defaultSelectId = node.wb.key
                }else{
                    // 如果不能选中就修正为最近一次记录的节点
                    diagram.select(diagram.findNodeForKey(defaultSelectId))
                }

            }else{//已取消选中
                icon.fill = '#7bdaff'
                icon.stroke = '#0f68b7'
            }
        }
    }

    setTimeout(()=>{
        // 默认选择节点
        diagram.select(diagram.findNodeForKey('start'))
        // 将指定节点作为中心点
        diagram.commandHandler.scrollToPart(diagram.findNodeForKey('start'));
    }, 1000)

    // 单击背景
    diagram.addDiagramListener('BackgroundSingleClicked', (e)=>{
        console.log('单击背景')
        
        // 单击背景保持节点的选中状态
        diagram.select(diagram.findNodeForKey(defaultSelectId))
    })
    
    // 创建一个节点模版
    diagram.nodeTemplate = $(go.Node, "Spot",
        $(go.Panel, "Auto",
            $(
                go.Shape, {
                    name: 'Icon',//节点选择事件需要用
                    figure: "Rectangle",
                    fill: '#022b4d',//背景
                    stroke: '#0f68b7',//边框
                    strokeWidth: 2//边框宽度
                },
                new go.Binding("figure", "figure"),
                new go.Binding("fill", (e)=>'#7bdaff'),//节点颜色
                new go.Binding("stroke", "color")
            ),
            $(
                go.TextBlock, {
                    margin: 8,
                    stroke: '#fff',//文字颜色
                    editable: true,
                },
                new go.Binding("text", "text")
            ),
        ),
        {
            click: nodeClicked,
            selectionAdorned: false,//去除节点选中时的边框
            selectionChanged: onSelectionChanged
        },
    );
    // 创建一个箭头模版
    diagram.linkTemplate = $(go.Link,
        {
            routing: go.Link.Orthogonal,// go.Link.Normal 直线 go.Link.Orthogonal 折线
            corner: 10,//折线圆角
            curve: go.Link.JumpOver,// go.Link.Bezier 曲线
        },
        //线条
        $(go.Shape,
            { stroke: '#ccc', strokeWidth: 2,},
            new go.Binding('stroke', 'link_color')
        ),
        //箭头
        $(go.Shape,
            { stroke: '#ccc', strokeWidth: 2, toArrow: "OpenTriangle" },
            new go.Binding('stroke', 'link_color')
        )
    );
    diagram.model = new go.GraphLinksModel(nodeDataArray, linkDatasArray)
</script>
</html>

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

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

相关文章

INCA使用记录(一):INCA新建工程及观测标定

目录 1、概述 2、INCA实用方法 2.1、新建工程-添加A2L 2.2、添加工作空间 2.3、添加实验选项 ​2.4、添加硬件配置 2.5、添加工程elf 2.6、初始化工程 2.7、测量与观测参数 2.8、更换A2L之后如何更新工程 1、概述 INCA作为汽车行业常用的一种XCP处理工具&#xff0c;对…

javascript基础十一:JavaScript中执行上下文和执行栈是什么?

一、执行上下文 简单的来说&#xff0c;执行上下文是对Javascript代码执行环境的一种抽象概念&#xff0c;只要有Javascript代码运行&#xff0c;那么它就一定是运行在执行上下文中 执行上下文的类型分为三种&#xff1a; 全局执行上下文&#xff1a;只有一个&#xff0c;浏…

基于MPC的自适应巡航控制(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Kyligence x 明道云|低代码平台助力中小企业实现存量背景下的创新增长

国内大部分制造企业在经历疫情后&#xff0c;终于迎来了市场端的消费需求的恢复和增长&#xff0c;但如何在激烈的竞争中以更少投入&#xff0c;获得更高回报&#xff0c;在市场上获得一席生存之地&#xff0c;成为了悬在众多企业头上的达摩克利斯之剑。在市场野蛮生长阶段时&a…

使用PYQT5和VTK实现一个六轴跟随的电路板转动动画效果

实现过程&#xff1a; 关于六轴&#xff1a; 线下有一个带有六轴姿态传感器的硬件设备&#xff0c;将采集到的三轴加速度和角速度的值每隔1秒通过串口发送给电脑&#xff0c;电脑上位机使用的是pyqt5&#xff0c;在python中调用serial模块进行串口数据的接收&#xff0c;接收…

专业是要选软工还是人工智能?

大家好&#xff0c;我是帅地。 在帅地的训练营里&#xff0c;也有不少 26 届的学员&#xff0c;不过大一即将过去&#xff0c;部分学校是到了大一后面或者大二才开始细分专业方向的&#xff0c;包括一些想要转专业的同学&#xff0c;也需要选择一个细分的方向&#xff0c;而且…

10:mysql----存储引擎--进阶篇

目录 1:MySQL体系结构 2:存储引擎简介 3:存储引擎特点 4:存储引擎选择 1:MySQL体系结构 连接层 : 最上层是一些客户端和链接服务&#xff0c;主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 :…

抽象轻松JavaScript

想象一样&#xff0c;现在有一个苹果&#xff0c;两个苹果&#xff0c;一箱苹果在你面前 看&#xff0c;上面的三种苹果&#xff0c;&#xff08;我写的是苹果就是苹果&#xff09; 语境1 例如你现在要搬运苹果&#xff01; 那么现在上面有苹果&#xff0c;一个&#xff0c;两…

阿里云的数据库架构如何设计,以实现高可用性和容灾性?

阿里云的数据库架构如何设计&#xff0c;以实现高可用性和容灾性&#xff1f;   在当今的数字化时代&#xff0c;数据库作为应用程序的核心组件之一&#xff0c;对于企业的正常运行至关重要。这篇文章将为您解析阿里云如何设计其数据库架构&#xff0c;以实现高可用性和容灾性…

加法器种类介绍

二进制加法器 二进制加法器接收加数A和B,以及进位Ci,输出和S,以及进位输出Co.二进制加法器的真值表如下&#xff1a; 逻辑表达式&#xff1a; S A ⊕ B ⊕ C i SA⊕B⊕C_i SA⊕B⊕Ci​ C o A B B C i A C i C_oABBC_iAC_i Co​ABBCi​ACi​ 从实现的角度&#xff0c;可以…

好兄弟,一天面了4家公司,堪称Offer收割机...

好兄弟一天面了4家公司&#xff0c;堪称Offer收割机… 面试感受 先说一个字 是真的 “ 累 ” 安排的太满的后果可能就是一天只吃一顿饭&#xff0c;一直奔波在路上 不扯这个了&#xff0c;给大家说说面试吧&#xff0c;我工作大概两年多的时间&#xff0c;大家可以参考下 在…

开关电源DCDC并联均流输出8V(XL4015)-2011年全国电赛题

2011年全国电赛题-开关电源模块并联供电系统&#xff0c;两路XL4015芯片做DCDC模块输出8V&#xff0c;采用主从均流法&#xff0c;可实现多种比例精确分配电流&#xff0c;效率在80%以上。 题目 设计并制作一个由两个额定输出功率均为 16W 的 8V DC/DC 模块构成的并联供电系统…

【事务】@Transactional 注解参数详解

文章目录 前言一、参数详解1.1、isolation&#xff08;事务隔离级别&#xff09;1.2、propagation&#xff08;事务传播机制&#xff09;1.3、readOnly&#xff08;事务读写性&#xff09;1.4、noRollbackFor 和 noRollbackForClassName&#xff08;遇到时不回滚&#xff09;1.…

PHPMySQL基础(四):模拟登录Login功能案例

PHP&MySQL基础&#xff08;一&#xff09;:创建数据库并通过PHP进行连接_长风沛雨的博客-CSDN博客 PHP&MySQL基础&#xff08;二&#xff09;:通过PHP对MySQL进行增、删、改、查_长风沛雨的博客-CSDN博客 PHP&MySQL基础&#xff08;三&#xff09;:处理查询SQL返…

敏捷指标: 评估计划的进展

作者 | Will Hayes, Patrick Place, and Keith Korzec ——卡耐基梅隆大学 度量标准有助于实现一个运作良好的系统&#xff0c;评判现有流程的绩效。在项目交付契约功能时能够对其性能进行监督。本文探讨了在一个复杂的信息物理系统的迭代、增量交付过程中&#xff0c;政府项目…

Django从Models 10分钟建立一套RestfulApi

简介 Django是一套完善而强大的web开发框架, 结合Django Restframework我们可以非常快的搭建一套后台的api, 该api主要特点: 标准的Restful接口, 支持增删改查 每个模型分列表和详情两种接口, 列表GET获取列表/POST新建,详情接口GET获取详情/PUT修改/DELETE删除所有接口自带权…

DJ4-5 基本分段存储管理方式

目录 4.5.1 分段式存储管理方式的引入 4.5.2 分段式存储管理的基本原理 一、分段 二、段表 三、地址变换机构 4.5.3 段的共享和保护 一、分页共享 二、分段共享 4.5.4 段页式存储管理 一、段页式存储管理的引入 二、段页式存储管理 三、地址变换机构 四、评价…

小明找前缀100000(假)

题目背景 小明最近上课天天睡觉&#xff0c;于是啥都不会。 一天&#xff0c;老师终于点兵点将点到他回答问题&#xff0c;你能帮他渡过难关吗&#xff1f; 现在老师给了小明 n 个由 0、1 构成的字符串&#xff0c;然后有 m 次询问&#xff0c; 每次询问给出一个由 0、1 构…

【医学图像】图像分割系列.3 (uncertainty)

介绍几篇使用不确定性引导的医学图像分割论文&#xff1a;UA-MT&#xff08;MICCAI2019&#xff09;&#xff0c;SSL4MIS&#xff08;MICCAI2021&#xff09;&#xff0c;UG-MCL&#xff08;AIIM2022&#xff09;. Uncertainty-aware Self-ensembling Model for Semi-supervise…

3-网络初识-协议

1.概念 协议&#xff0c;网络协议的简称&#xff0c;网络协议是网络通信&#xff08;即网络数据传输&#xff09;经过的所有网络设备都必须共同遵从的一组约定、规则。如怎么样建立连接、怎么样互相识别等。只有遵守这个约定&#xff0c;计算机之间才能相互通信交流。通常由三…