前端流程图之JointJS(四)

今天的工作重点分三块:

  1. 属性窗口,用于展示和修改单个节点的属性值
  2. Run to here(RTH)功能,任意选择一个节点,可以找出从根节点到当前节点到最短路径并进行着色
  3. 重新布局功能,对修改后的流程图进行重新布局
  4. 给页面加了一个外框架,感觉比较正式
  5. 重构了代码,集成到了require.js里

先上个效果图


效果图

有标题、菜单、缩进按钮、底部状态栏、中间的画布也可以通过拖拽进行resize,应该比较正规了。

属性窗口

这里使用的是rappid的Dialog和Inspector,代码是从rappid中扒出来的,这里只列一下使用方法。

Inspector,用于监控cell的值,并将其和input项关联起来。

var inspector = new joint.ui.Inspector({
    cell: element,
    live:false,
    inputs: {
        'name': {                              
             type: 'text',
             label: '文档名称',
             index:1
         },
         'name11': {
             type: 'text',
             label: '底数',
             index: 2
         }
    } 
}); 

Dialog显示弹出窗口,点击窗口外任何位置会关闭窗口

var dialog = new joint.ui.Dialog({
    type: 'inspector-dialog',
    width: 260,
    title: 'Edit Member', 
    closeButton: false,
    content: inspector.render().el,
    buttons: [{
        content: 'Cancel',
        action: 'cancel'
    }, {
        content: 'Apply',
        action: 'apply'
    }]

});

RTH
这里使用了graphlibdijkstra算法来计算两点之间的路径,然后对路径上所有点进行渲染。

RTH

showPath: function(src, dest) {
    var g = this.graph.toGraphLib();
    var result = graphlib.alg.dijkstra(g, src);
    var path = [];
    var target = dest;
    while (target != src) {
        path.push(target);
        target = result[target].predecessor;
    }
    path.push(target);
    path.reverse();
    this.resetGraph();
    path.forEach(function(id) {
        var cell = this.graph.getCell(id);
        if (cell) {
            cell.attr('rect/stroke', 'orange')
            cell.attr('rect/fill', 'orange')
        }
    }.bind(this))
},

重新布局
重新布局最关键的是要把joint的graph对象转换为graphlib对象,然后再转换回来,缺省的转换过程会把link的label丢掉,需要自己添加对应的回调函数来进行转换。

//joint graph -> graph lib
var g = this.graph.toGraphLib({
    setEdgeLabel: function(cell) {
        return cell.prop('labels/0/attrs/text/text');
    }
});

//graphlib -> joint graph
var self = this;
this.graph.fromGraphLib(g, {
    importNode: function(node) {
        this.addCell(self.makeElement(node));
    },
    importEdge: function(edge) {
        var label = g.edge(edge);
        this.addCell(self.makeLink(edge.v, edge.w, label));
    }
});

收集的代码(备用)

  //define the style of magnet links
  defaultLink: function(cellView, magnet) {
    return new joint.shapes.standard.Link({
        attrs: {
          line: {
            stroke: V(magnet).attr('port-group') === "blue-ports" ? "blue" : "red"
          }
        }
    }
  })
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,174评论 1 32
  • 概要 64学时 3.5学分 章节安排 电子商务网站概况 HTML5+CSS3 JavaScript Node 电子...
    阿啊阿吖丁阅读 9,432评论 0 3
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,958评论 1 45
  • 昨天为了搞活动,在网上呆了一天,卖力的与人沟通和聊天。虽然其中不免一些有趣的内容和值得反思的人和事儿,但是眼睛从网...
    暖暖滴文子阅读 403评论 0 2
  • 一直以来,我都极度赞成“读万卷书,行万里路”。所以,上大学时,才死死认定要到外省去读书。 大学四年,班里30个同学...
    光行天下阅读 829评论 2 7