构建图形
GoJs
绘制的图表(Diagram
)具有两个最基本的元素,就是点和线(Node
和Link
),并且他们可以自由组合组成一个组(Group
)。所有的元素都处在图层(Layer
)上,并且可以对它们进行布局(Layout
)。
通过常规方式
一个图形可以看做由节点和连线组成,在 GoJs
中,图形元素是 GraphObject
,我们可以使用常规方式创建节点:
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<script src="https://unpkg.com/gojs/release/go.js"></script>
</head>
<body>
<div id="diagram" style="border: solid 1px blue; width:400px; height:400px"></div>
<script>
// 创建画布
const diagram = new go.Diagram("diagram");
// 创建节点 节点中元素的排列方式是 Panel.Auto
const node = new go.Node(go.Panel.Auto);
// 创建一个图形
const shape = new go.Shape();
// 定义图形的属性
shape.figure = "RoundedRectangle";
shape.fill = "lightblue";
// 将图形加到节点
node.add(shape);
// 创建一个文本
const textblock = new go.TextBlock();
// 定义文本的属性
textblock.text = "Hello!";
textblock.margin = 5;
// 将文本加到节点
node.add(textblock);
// 将节点加到图
diagram.add(node);
</script>
</body>
</html>
通过 go.GraphObject.make
常规的编程方法虽然容易理解,但是需要定义大量的中间变量,如果需要创建的元素很多,就会感觉有些冗余,上面的代码可以通过 go.GraphObject.make
简化成如下
const diagram = new go.Diagram("diagram");
const $ = go.GraphObject.make;
diagram.add(
$(go.Node, go.Panel.Auto,
$(go.Shape,
{ figure: "RoundedRectangle", fill: "lightblue" }),
$(go.TextBlock,
{ text: "Hello!", margin: 5 })
));
这样会让代码量大幅减少,并且如果给元素赋值了错误的属性,make
函数内部会报出错误。
例如,将 text
写错为 test
,会在控制台看到报错:
Uncaught Error: Trying to set undefined property "test" on object: TextBlock("")
模型和模板
每个 Diagram
都是通过数据模型(Model
)来填充和确定 Node
的信息和 Link
的所属关系的。并且我们只需要创建好 Node
和 Link
的模板(Template
)以及数据模型(Model
),其他的是事情都交给 GoJs
去处理,它会自动加载模型并构建元素。
模板(Template)
虽然 go.GraphObject.make
创建图形的方式简单了许多,但是如果要创建很多的 Node
,而不同的 Node
之间结构相同,通过上面的方式,扔需要书写大量的重复代码。
如果能定义一个 Node
的模板,然后通过指定参数来定义节点,就会方便很多。
GoJS
中为我们提供了这种模板语法,后面会讲。
模型(Model)
GoJS
是一个 model-view
架构的库,画布里的点和连线是数据的可视化展示,它由模型 Model
进行管理。
GoJS
中 模型 控制着 数据,数据是一个 数组,数组中的每一个元素是一个 JavaScript
对象。
把 nodeDataArray
作为构造函数的参数,通过 new go.Model()
创建模型对象的实例,然后再把模型实例赋值给 diagram.model
属性就完成了对 Model
的管理。我们日常中的开发基本上就是在维护 nodeDataArray
这个数组。
语法:
const myModel = new go.Model(nodeDataArray);