GoJs的文本绘图模板TextBlock使用实例
作者:沅芷湘兰 发布时间:2023-08-26 16:01:00
前言
文接上回,我们已经使用gojs
实现了一个最最最基本的树形布局。这次我们开始对图形的骨架进行一个内容展示上的丰富和显示风格上的美化。可以说我们图形的节点部分是我们整个图形大部分信息的一个展示载体。而我们的需求当中,为了使一些信息更加形象,醒目。我们会用到文本,图标,图片,和节点的背景的颜色等等来显示不同类型的节点。
TextBlock的使用
本次的介绍便是通过TextBlock
的属性来控制节点内的文本显示内容和一些样式的修改,对我们的关系图进行进一步的丰富。首先我们先准备一些数据
nodes: [
{
key: "1",
text: "三国人物志",
nodeBs: "root",
},
{
key: "1-1",
text: "曹操",
nodeBs: "cc",
},
{
key: "1-2",
text: "刘备",
nodeBs: "lb",
},
{
key: "1-3",
text: "孙权",
nodeBs: "sq",
},
],
links: [
{
from: "1",
to: "1-1",
},
{
from: "1",
to: "1-2",
},
{
from: "1",
to: "1-3",
},
],
其中nodes
中的key
字段为节点的唯一标识,为必须。而text
字段则是我们希望显示到节点上的内容,nodeBs
主要是一个节点的标识,方便批量处理一些节点的时候进行判断。links
中存放的为必须的from(起点)和to(终点)字段。
this.myDiagram = $$(go.Diagram, "myDiagramDiv", {
layout: $$(go.TreeLayout),//在初始化时画布的布局方式
});
this.myDiagram.nodeTemplate = $$(
go.Node, //节点的node配置项
"Horizontal", //节点内部的布局方式
$$(
go.TextBlock,//指定为gojs规定的文本显示形式
new go.Binding("text", "text") //将我们的text字段显示到节点中
)
)
this.myDiagram.model = new go.GraphLinksModel(this.nodes, this.links);
在这里我们可以看一下,通过我们实例化之后的nodeTemplate
属性来实现我们的node
的模板进行一个自定义的填充内容,来实现节点内部不同内容的显示。其中go.Node
是固定搭配,就是我们是对node
模板进行一个配置,然后就需要我们我们的操作对象为node
,然后再内部嵌套各种其他的模板。Horizontal
是节点内部的一种布局方式,这个我们后面会统一进行分析。
当然你也可以写成这种形式
this.myDiagram.nodeTemplate = new go.Node().add(new go.TextBlock().bind("text"));
因为第一种的写法比较清晰,因此我们主要是采用第一种方式进行节点内的布局填充,这样我们就得到了这样一个图形
TextBlock的配置属性
在这里对显示的文字修改一下样式,这里列举一些常用的属性
$$(
go.TextBlock,//指定为gojs规定的文本显示形式
{
stroke: "red",//设置字体颜色,默认为黑色
background:"yellow",//字体的背景颜色,默认透明
font: "14px,sans-serif ",//字体的名称,大小,是否加粗等
margin:8,//类似css,外边距
width:20,//宽度
height:20,//高度
textAlign:'left',//文本的对齐方式,有left,center,right三种属性
alignment:go.Spot.Left, // 文本在父级结构中的对齐方式,有go.Spot.Left,go.Spot.Center,go.Spot.Right三种属性
minSize: new go.Size(10, 14),//文本的最小尺寸,两个参数分别为宽和高
maxSize: new go.Size(NaN, NaN), //文本的最大宽度,如果我们设置为NaN,其尺寸会进行自适应
overflow: go.TextBlock.OverflowClip,//文本溢出宽度之后的显示方式,OverflowClip为换行.OverflowEllipsis是显示省略号
maxLines: 2,//换行之后最多显示几行
verticalAlignment:"Top"//垂直方向上的的对齐方式,有Top,Center,Bottom三种属性
},
)
既然textAlign
和alignment
都是文本的对齐方式,那他们之间有什么区别呢?我们把节点单独给拿出来,然后分别对添加这两种属性的三个参数值进行对比一下。
$$(go.Panel, 'Vertical',{width:300,background:'#67B73C'},//父级模板,相当于外层html标签,然后我们给外层标签一个宽度
$$(go.TextBlock,{textAlign:'left',text:'textAlignLeft',width:200,background:'#FF9900',margin:5}),
$$(go.TextBlock,{textAlign:'center',text:'textAlignCenter',width:200,background:'#FF9900',margin:5}),
$$(go.TextBlock,{textAlign:'right',text:'textAlignRight',width:200,background:'#FF9900',margin:5}),
$$(go.TextBlock,{alignment:go.Spot.Left,text:'alignmentLeft',width:200,background:'#FF9900',margin:5}),
$$(go.TextBlock,{alignment:go.Spot.Center,text:'alignmentCenter',width:200,background:'#FF9900',margin:5}),
$$(go.TextBlock,{alignment:go.Spot.Right,text:'alignmentRight',width:200,background:'#FF9900',margin:5})
),
我们在外层增加一个模板并且添加宽度之后,分别在内层的文本标签设置不同的属性和属性值,显示内容可以知道。textAlign
属性是如果设置了文本区域的宽度,在文本显示区域内部居左、居中、居右显示。而alignment
属性则是以文本区域为一个整体,全部内容在父级模板中的相对位置居左、居中、居右。
然后我们看一下overflow
的两种文本溢出方式的区别
$$(go.Panel, 'Vertical',{width:300,background:'#67B73C'},
$$(go.TextBlock,{text:'go textBlock overflowDefult overflowDefult',width:100,background:'#FF9900',margin:5}),
$$(go.TextBlock,{text:'go textBlock overflowDefult overflowDefult',maxLines: 2,width:100,background:'#FF9900',margin:5}),
$$(go.TextBlock,{overflow: go.TextBlock.OverflowClip,text:'go textBlock overflowClip overflowClip',width:100,background:'#FF9900',margin:5}),
$$(go.TextBlock,{overflow: go.TextBlock.OverflowClip,maxLines: 2,text:'go textBlock overflowClip overflowClip',width:100,background:'#FF9900',margin:5}),
$$(go.TextBlock,{overflow: go.TextBlock.OverflowEllipsis,text:'go textBlock overflowEllipsis overflowEllipsis',width:100,background:'#FF9900',margin:5}),
$$(go.TextBlock,{overflow: go.TextBlock.OverflowEllipsis,maxLines: 2,text:'go textBlock overflowEllipsis overflowEllipsis',width:100,background:'#FF9900',margin:5}),
),
由此我们可以发现overflow
的两种属性go.TextBlock.OverflowClip
和go.TextBlock.OverflowEllipsis
在单独设置的时候是和默认效果没有区别的,都是会默认进行一个换行。而如果我们再加上行数的限制maxLines: 2
之后就出现了区别go.TextBlock.OverflowClip
属性是和默认情况是一样的,会对我们的文本进行一个整词切割,而go.TextBlock.OverflowEllipsis
则是出现了超出部门内容显示...,因此在开发过程中我们可以可以对超长文本进行go.TextBlock.OverflowEllipsis
属性和maxLines
的结合使用,保证项目中的的节点的规格不至于过长而导致图形的显示冗余。
节点内文本的双击编辑
gojs还为我们提供了editable
属性,可以在节点内直接双击出现的输入框对我们的节点内的文本显示进行一个编辑,在编辑完成之后,只需要点击画布就可以把编辑后的内容显示到节点之中。
$$(
go.TextBlock,
{
editable:true,//是否开启双击编辑节点内部文本功能
textEdited: function (tb, olds, news) {//编辑文本成功之后的回调函数
console.log(tb.part.data,olds,news)
}
},
new go.Binding("text", "text")
),
在节点的文本框双击之后就可以出现一个输入框的弹出,可以输入新的内容之后点击画布,然后在编辑成功之后的回调函数textEdited
分别有三个参数,我们可以通过第一个参数的tb.part.data
来获取我们操作的节点的全部数据,而第二个参数则是编辑之前的内容(也就是我们示例中的曹操),而第三个参数则是我们编辑之后的内容(也就是我们示例中的曹操阿瞒)。因此我们可以通过获取之后的新值来更改我们的数据来保证数据和图中内容对应。
来源:https://juejin.cn/post/7220712723600277541
猜你喜欢
- 微软今天宣布正式发布SQL Server 2008服务器软件,这将帮助微软与Oracle 11g,IBM DB2 9.5数据库产品对抗.此前
- 大家一定使用过 phpmyadmin 里面的数据库导入,导出功能,非常方便。但是在实际应用中,我发现如下几个问题:1、数据库超过一定尺寸,比
- select * from V$NLS_PARAMETERS; SQL> alter session set NLS_DATE_LAN
- 为什么传输几千个表的数据时向导会失败?当前的向导体系结构会创建一个 DTS 软件包数据流以传输数据。但如果要处理几千个表,则会遇到可伸缩性限
- 源码: 代码如下: <% '隐藏并修改文件的最后修改时间的aspshell '原理:通过FSO可以修改文件的属性,比
- 总结调试网站获取cookies时请查看,r.header和r.request.header这两个属性,因为cookie说不准出现在他们俩谁里
- 熟悉js的朋友很多都遇到过js的数组与字符串相互转换的情况,本文就此作一简单介绍,示例如下:一、数组转字符串需要将数组元素用某个字符连接成字
- 相信认真做过网页设计(Web Design),或者关注过页面设计的同行都对“空格”不陌生。“空格”属于一类细节,很容易被忽略,但又比较影响效
- PHP hebrev() 函数实例反向显示希伯来字符:<?php echo hebrev("á çù&
- <!--#include file="Include/Conn.asp"--><%If(Request
- 等啊等,约会都回来了,终于等到了Google放出今年的情人节Logo,原本下午四点就可以上线的这篇文章,为了等待Google谷歌美国总部的那
- 平时我们获取事件对象一般写法如下:function getEvent(event) { return event
- 任何数据库系统都无法避免崩溃的状况,即使你使用了Clustered,双机热备等等,仍然无法完全根除系统中的单点故障,何况对于大部分用户来说,
- [asp] 献一函数:ASP获取ACCESS数据库的表名以及表名对应的字段名和字段类型<%showtable "../dat
- 在网络浏览器软件中,可以Internet Explorer (IE)现在是一种标准的软件。可以看到,运行不同版本的Windows操作系统(和
- 增大 SGA 已经缓冲看来对于性能的提升并不显著,加载时间只提升了 1.73%。下面我们增加 SGA 重做日志的大小: DB3: Log B
- 前言:perl是什么,干什么用的?perl原来设计者的意图是用来处理 字符的,80%的强项是处理字符,当然其它的很多都可以。现在很多网页也是
- 有个简单的方法,使用display:table, display:table-row and display:table-cell 就可以实
- 这篇文章主要是把ASP代码变成组件,开发者不仅是加快了ASP的速度,而且也能保护加密自己的代码,编译asp代码为dll组件我想这个是最好的保
- PDOStatement::closeCursorPDOStatement::closeCursor — 关闭游标,使语句能再次被执行。(P