可视化图表库--goJS详细学习线路

GoJS是一个用于创建交互式图表的JavaScript库,擅长实现流程图、关系图等多种图表。采用MV架构,通过数据绑定和模板实现图表与数据的同步。Diagram是图表的核心,包含Nodes和Links。Model管理数据,提供了GraphLinksModel和TreeModel两种模型。模板定义了Node、Link和Panel的外观和行为。布局算法如GridLayout和ForceDirectedLayout用于自动排列节点。GoJS支持丰富的图表事件和自定义工具栏功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.GoJS简介

GoJSNorthwoods Software的产品。Northwoods Software创立于1995年,专注于交互图控件和类库。旗下四款产品:

GoJS 用于在HTML上创建交互图的纯javaSCript库
GoDiagram 用于WinForms的.NET图控件。
GoXam 用于WPF/Silverlight的图控件。( Silverlight是一个跨浏览器的、跨平台的插件, 与flash竞争的富客户端技术)
JGo 用于Swing/SWT中创建交互图的java库

 

1.1 GoJS可以做什么? 

GoJS是一个实现交互类可视化图表(比如流程图,柱状图 ,线形图 ,树图,关系图, 蜡烛图 ,力导图,决策树 ,思维导图,管道图,进度图等等)的JS库。GoJS为用户交互提供了许多高级功能,如拖放,删除,复制和粘贴,撤销与重做,文本编辑,工具提示,上下文菜单,自动布局,数据绑定和模型,事务状态和撤销管理,事件处理程序,命令以及用于自定义操作的可扩展工具系统等等。

1.2 为什么使用GoJS

用对象数据表达数据之间的逻辑关系,远不如用图像展示形象直观 ,一图胜千言,为了更直观地表达信息,我们常常需要用图形来展示数据以及逻辑关系。goJS图表种类,交互行为丰富,自定义模板灵活,已经有非常多的图表例子,支持复杂的模板定义和数据绑定,足够解决实际业务中的常见图表需求。
 

2. GoJS概念

 

图表(Diagram)

所有GoJS的属性和方法都在go这个命名空间下。所有GoJS的类名,例如Diagram、Node、Panel、 Shape、TextBlock也都使用go作为前缀,go.GraphObject.make来创建一个GoJS对象

GoJS图表即最后看到的可视化视图,它是由这些部分构成的:一个或多个可能有连接关系的、可能成组的节点。所有这些节点和链路聚集在相同或不同的层中,并呈现出一定的布局(开发者预定好的或GoJS自动布局)。

 

 Diagram(图表属性)

画布图表基本配置
画布初始位置(定义之后就不能拖动了) initialContentAlignment: go.Spot.Center
初始坐标 initialPosition: new go.Point(0, 0)
禁止移动节点 allowMove:false
禁止复制 allowCopy: false
禁止删除 allowDelete:false
禁止选中  allowSelect:false
禁止缩放 allowZoom: false
禁止撤销和重做 "undoManager.isEnabled": false

禁止水平拖动画布

禁止水平滚动条

 

allowHorizontalScroll: false

禁止垂直拖动画布

禁止垂直滚动条

allowVerticalScroll: false
只读 isReadOnly: true
画布初始化动画时间 "animationManager.duration": 600
禁止画布初始化动画 "animationManager.isEnabled": false
画布比例 scale:1.5
画布最小比例 minScale:1.2,
画布最大比例  maxScale:2.0,
显示网格  "grid.visible":true,
禁止鼠标拖动区域选中 "dragSelectingTool.isEnabled" : false, 
画布边距padding Margin padding:80或者new go.Margin(2, 0)或new go.Margin(1, 0, 0, 1)

 


 
 

更多设置参见 https://gojs.net/latest/api/symbols/Diagram.html

2.1 MV架构

GoJs使用model-view(MV架构)的模式,Models作为数据层来管理那些描述性的数据(JS数组对象),Diagrams则负责视图层,将Nodes和Links的数据以可视化的方式渲染出来。Diagrams中的Nodes(节点)和Links(连线)呈现是由Model进行管理的。model和Diagrams实现了数据绑定,通过监听Model数据,自动改变Nodes上的GraphObjects外观和行为。Model数据对象是一个普通的JavaScript对象。我们编程操作只针对Model的数据层,而不是Diagrams的视图层。可以按照业务需求在Models数据对象上面添加任意属性,一般不需要修改Diagram的prototype(原型)和GraphObject(绘图单元)的classes(类).

 

数据绑定是指从源对象中提取值并在目标对象上设置属性。目标对象就是图形对象(GraphObject),源对象是模型中保存的js数据对象。

使用模板和数据绑定简化了存储在模型数据中的信息,灵活性非常强。当然并不是所有的数据属性都需要绑定使用

go.Binding VS 双向数据绑定(Two-way data binding)

go.Binding绑定只将属性的值从源数据转移到目标对象。但有时我们希望能够将GraphObject中的值传输回模型数据,使得模型数据与ui界面的图标中的数据保持一致。这可以通过使用TwoWay 绑定,它可以完成从源数据到目标对象,以及从目标对象到源数据的值传递。

2.2 图表(Diagram)

所有GoJS的属性和方法都在go这个命名空间下。所有GoJS的类名,例如Diagram、Node、Panel、 Shape、TextBlock也都使用go作为前缀,go.GraphObject.make来创建一个GoJS对象

GoJS图表即最后看到的可视化视图,它是由这些部分构成的:一个或多个可能有连接关系的、可能成组的节点。所有这些节点和链路聚集在相同或不同的层中,并呈现出一定的布局(开发者预定好的或GoJS自动布局)。

 Diagram(图表属性)

画布初始位置(定义之后就不能拖动了) initialContentAlignment: go.Spot.Center
初始坐标 initialPosition: new go.Point(0, 0)
禁止移动节点 allowMove:false
禁止复制 allowCopy: false
禁止删除 allowDelete:false
禁止选中  allowSelect:false
禁止缩放 allowZoom: false
禁止撤销和重做 "undoManager.isEnabled": false

禁止水平拖动画布

禁止水平滚动条

allowHorizontalScroll: false

禁止垂直拖动画布

禁止垂直滚动条

allowVerticalScroll: false
只读 isReadOnly: true
画布初始化动画时间 "animationManager.duration": 600
禁止画布初始化动画 "animationManager.isEnabled": false
画布比例 scale:1.5
画布最小比例 minScale:1.2,
画布最大比例  maxScale:2.0,
显示网格  "grid.visible":true,
禁止鼠标拖动区域选中 "dragSelectingTool.isEnabled" : false, 
画布边距padding Margin padding:80或者new go.Margin(2, 0)或new go.Margin(1, 0, 0, 1)

 

更多设置参见 https://gojs.net/latest/api/symbols/Diagram.html

2.3 模型(Model)

每个图表都有一个数据模型,用于保存开发者程序的数据。模型描述了节点之间的连接关系和组成员关系。用模型 Model.nodeDataArray 为每个数据项创建一个节点或组, 用模型 GraphLinksModel.linkDataArray 为每个数据项创建一个链接。而且,我们可以为每个数据对象添加所需的任何属性。

Models的种类

自定义的node模板让我们的图表看起来更美观,如果要创建一个完整的关系图,通过添加一些连线来表示这些独立的节点之间的对应关系,同时这些节点能够进行自动定位和排版。在我们的图表里为了得到这些连线,基本的Model已经满足不了需求。我们必须从GOJS中的支持连线的另外两个Models里选择,GraphLinksModel和TreeModel

GraphLinksModel中,除了model.nodeDataArray还有model.linkDataArray。它包含一个数组对象,通过”to”和”from”来描述没一个连线。

GraphLinksModel允许两个节点之间存在任何数量和任意方向的连线。比如A到B可以连10条线,B到A可以连3条以上反方向的线

TreeModel比GraphLinksModel更简单,但是不能随意的建利连接关系,就像2个节点之间有多条线,又或者有多个父级节点。

2.4 模板(Template)

模板声明了每个节点或链路的外观、位置和行为。

2.4.1 Nodes模板

* Shape 预定义的或者自定义的几何图形 

 "Rectangle"--矩形, "RoundedRectangle"--圆角矩形, "Square"--正方形 "Ellipse"--椭圆  "Diamond"--菱形,  "Circle"--圆形   各种三角形 "TriangleRight", "TriangleDown", "TriangleLeft", "TriangleUp", "Triangle",

 "LineH", "LineV", "BarH", "BarV", "MinusLine", "PlusLine", "XLine"

* TextBlock 拥有各种各样字体的文本(可编辑)
* Picture 图片
* Panel 根据不同面板的类型,它可以包含其他位置或是尺寸不同的对象。(列如表格、 竖形列表和拉伸容器等)

TextBlocks不能包含图片;Shapes不能包含文字。如果你想让你的Node显示文字,你必须使用TextBlocks。如果你想绘制一些几何图形,你就必须使用Shape。

复制代码

myDiagram.nodeTemplate = $(
        go.Node,
        "Horizontal",
        { background: "#44CCFF" },
        $(
          go.Shape,
          "Rectangle",
          {
            portId: "",
            fromLinkable: true,
            toLinkable: true,
            cursor: "pointer",
            fill: "white",
            strokeWidth: 1
          },
          new go.Binding("figure"),
          new go.Binding("fill")
        ),
        $(go.Picture, { margin: 10, width: 50, height: 50, background: "red" }, new go.Binding("source"), new go.Binding("figure")),
        $(go.TextBlock, "Default Text", { margin: 12, stroke: "white", font: "bold 16px sans-serif" }, new go.Binding("text", "name"))
      );

复制代码

所有的这些building block类都是由GraphObjects抽象对象衍生出来。因为GraphObject不是DOM元素,所以创建和修改它们对性能开销不大。多个不同样式的Node节点模板可以通过myDiagram.nodeTemplateMap.add(go.Node)添加

复制代码

 myDiagram.nodeTemplateMap.add("Center",
        $(go.Node, "Spot",
          {
            selectable: false,
            isLayoutPositioned: false,  // the Diagram.layout will not position this node
            locationSpot: go.Spot.Center
          },
          $(go.Shape, "Circle",
            { fill: radBrush, strokeWidth: 0, stroke: null, desiredSize: new go.Size(200, 200) }), // no outline
          $(go.TextBlock, "Arrowheads",
            { margin: 1, stroke: "white", font: "bold 14px sans-serif" })
        ))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值