vue中使用mxgraph插件流程图(第2弹)

mxgraph项目实战中遇到的问题

mxgraph是一款比较复杂的插件,毕竟都是英文的官方文档,在所难免会遇到一些问题,下面跟大家分享一下我的问题及解决方法:

1. 新建节点必须配合try…finally方法

 insertVertexHandler(id, x, y) {
  //获取元素
  const element = getOptionsElement(this.asideOptions, id);
  //获取图片
  const src = element.icon;
  //获取标题
  const title = element.title;
  //设置样式
  const style = {
    [mxConstants.STYLE_SHAPE]: mxConstants.SHAPE_IMAGE,
    [mxConstants.STYLE_PERIMETER]: mxPerimeter.RectanglePerimeter,
    [mxConstants.STYLE_IMAGE]: this.getImageUrl(src + "2x"),
    [mxConstants.STYLE_IMAGE_WIDTH]: 45,
    [mxConstants.STYLE_IMAGE_HEIGHT]: 45,
    [mxConstants.STYLE_SPACING_TOP]: 3,
    [mxConstants.STYLE_VERTICAL_ALIGN]: mxConstants.ALIGN_TOP,
    [mxConstants.STYLE_FONTCOLOR]: "#000000",
    //标签内容显示的位置
    [mxConstants.STYLE_VERTICAL_LABEL_POSITION]: mxConstants.ALIGN_BOTTOM,
  };
  let parent = graph.getDefaultParent();
  //开始插入前更新,必须放在try外面
  graph.getModel().beginUpdate();
  graph.getStylesheet().putCellStyle("start", style);
  try {
    let nodeRootVertex = graph.insertVertex(
      parent,
      null,
      title,
      x,
      y,
      45,
      45,
      "start"
    );
    //添加节点右上角小图标的方法
    this.addOverlayHandler(nodeRootVertex);
    nodeRootVertex.vertex = true;
    // 自定义的业务数据放在 data 属性
    let data = {
      id,
      element
    }
    // nodeRootVertex.data = JSON.stringify(data);
    nodeRootVertex.data = new graph.CustomData(data)
  } finally {
    //插入结束后更新,finally 里保证每次执行
    graph.getModel().endUpdate();
  }
},

2. 整理布局算法后的线没有垂直居中(无法对齐)
如下图:
在这里插入图片描述

mxgraph提供了许多布局整理的算法,我用的是其中一个层次布局算法,代码如下:

 //mxHierarchicalLayout:分层布局算法的其中一种
let layout = new mxHierarchicalLayout(
  graph,
  mxConstants.DIRECTION_WEST,
  true
);
layout.disableEdgeStyle = false;
let parent = graph.getDefaultParent();
layout.execute(parent);

解决方法:改变默认连接线条样式
[mxConstants.STYLE_EDGE]: mxConstants.EDGESTYLE_ORTHOGONAL
改为
[mxConstants.STYLE_EDGE]: mxEdgeStyle.EntityRelation

const style = this.getStylesheet()
  .getDefaultEdgeStyle();
Object.assign(style, {
  [mxConstants.STYLE_ROUNDED]: true,
  [mxConstants.STYLE_STROKEWIDTH]: '1.5',
  [mxConstants.STYLE_STROKECOLOR]: '#808080',
   // 更改连接线条样式
  [mxConstants.STYLE_EDGE]: mxEdgeStyle.EntityRelation,
  [mxConstants.STYLE_FONTCOLOR]: '#333333',
  [mxConstants.STYLE_LABEL_BACKGROUNDCOLOR]: '#ffa94d',
});
// 设置拖拽线的过程出现折线,默认为直线
// this.connectionHandler.createEdgeState = () => {
//   const edge = this.createEdge();
//   return new mxCellState(this.view, edge, this.getCellStyle(edge));
// };

然后会惊奇的发现对齐了!
在这里插入图片描述
3. 给节点的右上角增加状态小图标

 //绘制给定单元格状态的形状
addOverlayHandler(cell) {
  //先清除上次添加的
  graph.clearCellOverlays(cell);
  var overlay = new mxCellOverlay(new mxImage('https://yqz.cdn.jkcrm.cn/crm/image/flow/SPS/state_executed.png', 24, 24), '成功');
  overlay.cursor = 'hand';
  overlay.align = 'right';
  overlay.verticalAlign = 'top';
  graph.addCellOverlay(cell, overlay);
},

效果:
在这里插入图片描述
4. 撤销后如何获取变动的节点信息传输给后端
撤销某一操作后,需要减少服务器的压力,所以需要获取局部改动的数据信息。

 //撤销的方法
undoManager.undo();

解决:undoManager是一个历史记录管理器,可直接打印就可以获取history历史操作记录数据
在这里插入图片描述

5. 修改mxgraph原生提示
该插件自带原生的提示弹窗,但可能不是我们想要的样子
在这里插入图片描述

解决:需要在原型链上改动一下它的“基因”

//原型重写
mxGraph.prototype.validationAlert = function(message){
    that.$message.error(message);
} 

6. 修改节点文本样式
设置单独样式,在插入节点时设置的样式名称后(如start)修改指定样式,之间以;分隔

let arr = new Array();
arr[0] = cell;
//第一个参数传样式字符串,第二个参数指定修改样式的节点数组
graph.setCellStyle('start;fontColor=#333;', arr);

7. 删除节点-只删除当前节点牵连的节点

此方法会删除与该节点所有相关联的线

 deleteSubtree(cell) {
    const cells = [];
    this.traverse(cell, true, (vertex) => {
       console.log('删除节点元素vertex',vertex);
       cells.push(vertex);
       return true;
   });
    this.removeCells(cells);
  }

有时候我们可能并不需要全部删除,只删除与当前节点牵连的线或节点

deleteSubtree(cell) {
   const cells = [cell];
   // this.traverse(cell, true, (vertex) => {
   //   console.log('删除节点元素vertex',vertex);
   //   cells.push(vertex);
   //   return true;
   // });
   this.removeCells(cells);
 }

8. 批量删除多个节点后 还原撤销导致图标一致(每次还原的都是最后一个的样式)

解决:每次插入节点之后都要添加不同样式,保证每个节点的style类名都是唯一的

graph.getStylesheet().putCellStyle('analysis', style);

//改为动态的,比如后面可以拼接唯一的id
let onlyStyle = "analysis"+id
graph.getStylesheet().putCellStyle(onlyStyle, style);

不定期更新中~~~~
谢谢观看♥~~~~

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值