一、数据准备
1.1 概述
- id最好设置为数值型,方便后面的查找工作,需要通过id值查找其在staticNodes中的下标值
1 | // 设置点和边的数据 |
1.2 数据格式
1.2.1 格式要求
- 一般vis要显示network,需要以下格式
- node:id、label、group
- edge:id、label、from、to
- 为了实现节点展开收缩就需要在nodes中再添加两个字段:
- pid:父节点id
- subids:子节点id列表
1.2.2 后端实现方案(首页展示):
- 需要先给数据分层,添加level标签,表示层级关系,只需要标注第一层即可,因为其他层会因点击事件而进行展开
- nodes节点中的pid和subids需要进行判断,再进行添加
- 设置pid:根据关系进行判断(根据to,查找from),对于单向关系,比如(我,有,篮球),那么篮球的pid就设置为“我”的id值,注意:目前只考虑节点的父节点只有一个的情况,如果pid有多个就需要设置列表
- 设置subids:根据关系进行判断(根据from,查找to),如存在一组关系(我,有,篮球)、(我,年龄,18),那么“我”的subids即表示为“篮球”和“18”对应id组成的列表
- 设置group:group是为了对节点进行区分
- 前端实现:在进行节点展开时,会为nodes添加节点数据,这里就可以为节点添加上相同group,可以取一个随机整数
- 后端实现:对于关系中from标签相同的一组关系,为其to标签对应的节点添加上相同group值
- 为vis注入数据时,先注入第一层的数据,即先显示第一层的节点关系
二、vis.js绘制network
2.1 将数据注入到vis中
1 | var nodes = new vis.DataSet(staticNodes); |
2.2 配置network
1 | // 创建一个图的容器 |
2.3 为节点创建点击事件
1 | // 点击事件获取的是节点的列表,一般列表中只有一个节点id |
三、展开收缩逻辑
- 具体的逻辑实现如下:
- 第一步:getSubNodes函数获取到点击节点的下级节点id列表subNodes
- 第二步:判断subNodes是否为空,如果不为空执行第三步,否则执行第四步
- 第三步:如果不为空:遍历subNodes中的id值,在staticNodes中找到其对应的节点并在nodes/edges中进行递归remove(收缩操作)
- 第四步:如果为空:判断点击的节点是否存在下级节点列表subids,如果存在,执行第五步(展开操作)
- 第五步:遍历subids下级id列表,在staticNodes中查找到对应的节点,添加到nodes和edges中,实现节点的展开操作
- 收缩时,如果点击节点的下一级节点中包含下下一级节点,则进行递归查找并收缩,实现方法为removeNodes
1 | // 根据id值查找其对应的下标 |