基于jquery的web在线流程图设计器gooFlow,jquerygoo

时间:2019-05-11 09:45来源:计算机教程
  基于jquery的web在线流程图设计器gooFlow,jquerygooflow 常用API   操作类API   API 例子 应用场景 添加节点 myDiagram.model.addNodeData(node); var node = {}; node[key] = 节点Key; node[loc] = 0 0;//节点坐标

 

基于jquery的web在线流程图设计器gooFlow,jquerygooflow

常用API   操作类API

  API 例子 应用场景
添加节点
myDiagram.model.addNodeData(node);
var node = {};
    node["key"] = "节点Key";
    node["loc"] = "0 0";//节点坐标
    node["text"] = "节点名称";
myDiagram.model.addNodeData(node);
通过按钮点击,添加新的节点到画布
删除选中节点
myDiagram.commandHandler.deleteSelection();
if (myDiagram.commandHandler.canDeleteSelection()) {
    myDiagram.commandHandler.deleteSelection();
    return;
}
页面上有个按钮点击,可以删除选择的节点和线
获取当前画布的json
myDiagram.model.toJson()
var model= myDiagram.model.toJson();获得整个画布的json
//model=eval('(' model ')');若格式异常抓一下
var nodes=model.nodeDataArray;取出所有节点
var Links=model.linkDataArray;取出所有线
获取当前画布的所有元素的json,用来保存
加载json刷新画布
myDiagram.model = go.Model.fromJson(model);
model=myDiagram.model.toJson()
myDiagram.model = go.Model.fromJson(model);
一般用来刷新和加载画布上的元素
通过节点key获取节点
myDiagram.model.findNodeDataForKey('key')
var node = myDiagram.model.findNodeDataForKey('key');
知道节点key ,拿到这个节点的详细信息
更改节点属性值
myDiagram.model.setDataProperty(node, 'color', "#ededed");
var node = myDiagram.model.findNodeDataForKey('key');//首先拿到这个节点的对象
myDiagram.model.setDataProperty(node, 'color', "#ededed");//然后对这个对象的属性进行更改
更改节点的颜色,或者大小等
获取获得焦点的第一个元素,可为节点或者线
myDiagram.selection.first()
var node=myDiagram.selection.first();
        console.log(node.data.key);
 
获取所有获得焦点的节点 myDiagram.nodes
var items='';
  for(var nit=myDiagram.nodes;nit.next();){
        var node=nit.value;
       if(node.isSelected){
           items =node.data.key ",";
         }
     }
 console.log(items);
 
遍历整个画布的节点信息写法1  
for(var nit=myDiagram.nodes;nit.next();){
                    var node=nit.value;
                    var key=node.data.key;
                    var text=node.data.text;
                }
 
给节点添加线
myDiagram.model.addLinkData({ from: "节点的Key", to: "连到另一节点的key" })
   
选中节点  
var newdata = { "text":"AAAA", "key":-33,"loc":"0 0" };
            myDiagram.model.addNodeData(newdata);
            var newdat2= myDiagram.model.findNodeDataForKey('-3');
            console.log(newdat2);
            var node = myDiagram.findNodeForData(newdat2);
            console.log(node);
 myDiagram.select(node);//选中节点
 
特殊案例API用法
myDiagram.findNodeForData(objNode)
myDiagram.findLinkForData(objLink)
其中objNode或者objLink,只能从画布的json 对象取出,
不能直接手写例如
var newdata={"text":"AAAA","key":-33,"loc":"0 0"};
var node = myDiagram.findNodeForData(newdat2);
除了刚好是新建的节点外,,不然是获取不到这个对象的,因为添加节点时,gojs会自动给节点或者线添加一个属性
 

1、Gooflow特点

常用事件定义API,和用法

应用场景

关键字

例子

例子描述

节点选中改变事件

selectionChanged: 回调的函数方法名

//该属性要写在$(go.Node,)内用大括号括起来,如右侧例子

myDiagram.nodeTemplate =
   $(go.Node, "Horizontal",
        { selectionChanged: nodeSelectionChanged },
          //节点选中改变事件,nodeSelectionChanged为回调的方法名
        $(go.Panel, "Auto",
           $(go.Shape,//节点形状和背景颜色的设置
                { fill: "#1F4963" },
                 new go.Binding("fill", "color")
           ),
        )
    );//go.Node的括号

//回调方法
function nodeSelectionChanged(node) {
      if(node.isSelected) {//
         //节点选中执行的内容
         console.log(node.data);//节点的属性信息
         console.log(node.data.key);//拿到节点的Key,拿其他属性类似
         var node1 = myDiagram.model.findNodeDataForKey(node.data.key);
         myDiagram.model.setDataProperty(node1, "fill", "#ededed");
      } else {
         //节点取消选中执行的内容
         var node1 = myDiagram.model.findNodeDataForKey(node.data.key);
         myDiagram.model.setDataProperty(node1, 'fill', "1F4963 ");       
      }
}

节点选中的时候是一种颜色,取消选中是另一种颜色

节点双击事件

doubleClick : function(e, node){
  //node为当前双击的节点的对象信息
 //该属性要写在$(go.node,)内用大括号括起来,如右侧例子
}

myDiagram.nodeTemplate =
   $(go.Node, "Horizontal",
        $(go.Panel, "Auto",
           $(go.Shape,//节点形状和背景颜色的设置
                { fill: "#1F4963" },
                 new go.Binding("fill", "color")
           ),
           {doubleClick : function(e, node){// 双击事件
                             handlerDC(e, node);//双击执行的方法
                          }
           }
        )
    );//go.Node的括号

//双击执行的方法
function handlerDC(e, obj) {
     var node = obj.part;//拿到节点的json对象,后面要拿什么值就直接.出来
     var procTaskId = node.data.key;
     var procTaskName = node.data.text;
     var description = node.data.description;
     var procTmplId = node.data.tmplId;
}

该例子主要应用场景为,双击节点,得到节点的详细信息,弹出窗口修改节点的信息,

从Palette拖过来节触发的事件

myDiagram.addDiagramListener("externalobjectsdropped", function(e) {
        console.log(e);
    })

 myDiagram.addDiagramListener("externalobjectsdropped", function(e) {
        e.subject.each(function(n){
            //得到从Palette拖过来的节点
                 console.log(n.data.key);
         });
    }) 

 

当前画布被拖动的节点

未测试,线保存

myDiagram.addDiagramListener("Modified", function(e) {
        myDiagram.isModified = false;

        iter = myDiagram.selection.iterator;

        while (iter.next()) {
            var part = iter.value;
            if (part instanceof go.Link) {
               if ( ( part.data.from == 0 || part.data.from == undefined) || ( part.data.to == 0 || part.data.to == undefined )  ) {
                    myDiagram.model.setDataProperty(part.data, 'link-color', 'red');
                    console.log(part.data);
                    console.log("非法");
               } else if(part.data.from > 0 || part.data.from < 0 ) {
                    var node = myDiagram.findNodeForKey(part.data.from);
                    if (!node) {
                        console.log("非法");
                    }
               }else if(part.data.to > 0 || part.data.to < 0 ) {
                    var node = myDiagram.findNodeForKey(part.data.to);
                    if (!node) {
                        console.log("非法");
                    }
               }
            }
        }

 

 

1.1 跨浏览器

可兼容IE7--IE10, FireFox, Chrome, Opera等几大内核的浏览器,且不需要浏览器再加装任何控件。

画布基本定义类API

     
定义gojs在全局的简洁符号(扯淡不知道怎么描述)
var $ = go.GraphObject.make;
 
定义画布的基本属性
myDiagram = $(go.Diagram, "myDiagram", //画布绑定的Div的ID
            {
                  initialContentAlignment: go.Spot.Center, //画布的位置设置(居中,靠左等)
                  allowDrop: true, // must be true to accept drops from the Palette
                  "LinkDrawn": showLinkLabel, //
                  "LinkRelinked": showLinkLabel,
                  "animationManager.duration": 600, //画布刷新的加载速度
                  "undoManager.isEnabled": true,
                  //"toolManager.mouseWheelBehavior": go.ToolManager.WheelZoom,
                  allowZoom: true    //允许缩放,false为否
                  isReadOnly: false //是否禁用编辑 false否,    
true是
  //ismodelfied:true //禁止拖拽


            });
没写的注释的就是忘了,
这里绑定画布所用的div,并保存在myDiagram中,后续的节点设置均使用这个变量,意思是在这个画布上定义节点和操作节点
     

 

1.2 多系统兼容性、可移植性

由于只包括前台UI,因此二次开发者可很方便将本插件用在任何一种需要流程图的B/S系统应用上,流程图的详细实现逻辑完全交于后台程序开发者自己实现;对于后台,只要能返回/接收能被本插件解析的JSON格式数据即可.所以本插件可用于不同的服务器语言建立的后台上.

画布元素属性定义类API

  api 例子
定义单种节点
myDiagram.nodeTemplate=$(go.Node,***)
//***为对节点的定义
 
myDiagram.nodeTemplate =
   $(go.Node, "Horizontal",
        { selectionChanged: nodeSelectionChanged },
          //节点选中改变事件,nodeSelectionChanged为回调的方法名
        $(go.Panel, "Auto",
            $(go.Shape,//节点形状和背景颜色的设置
                { fill: "#1F4963", stroke: null }
            ),
            $(go.TextBlock,
                { font: "bold 13px Helvetica, bold Arial, sans-serif",//字体
                  editable:true,
                  stroke: "white",//颜色
                  margin: 3 },
                  new go.Binding("text", "key")
            )//go.TextBlock,的括号
       )//go.Panel 的括号
    );//go.Node的括号
定义多种节点(画布上有多种节点)
myDiagram.nodeTemplateMap.add("A种节点",$(go.Node,***))
//一种类型的节点
myDiagram.nodeTemplateMap.add("Start",
       $(go.Node, "Spot",
            $(go.Panel, "Auto",
                 $(go.Shape, "Circle", {
                     minSize: new go.Size(40, 40),
                     fill: "#79C900",
                     stroke: null
                 })
            )
        )//go.Node的括号
);
//另一种类型的节点
myDiagram.nodeTemplateMap.add("End",
       $(go.Node, "Spot",
            $(go.Panel, "Auto",
                 $(go.Shape, "Circle", {
                     minSize: new go.Size(40, 40),
                     fill: "#DC3C00",
                     stroke: null
                 })
            )
       )//go.Node的括号
);

//添加不同种类的节点
      var node = {};
      node["text"] = "2222";
      node["key"] = "33";
      node["loc"] = "0 0";
      node["category"] = "Start";//category
      myDiagram.model.addNodeData(node);
定义线
myDiagram.linkTemplate=$(go.Link,***);
 

1.3 跨领域

流程图设计器不止用在电信领域,在其它需要IT进行技术支持的领域中都有重大作用. 

添加监听事件

监听节点生成事件
//添加监听节点生成事件
myDiagram.addDiagramListener("externalobjectsdropped", function(e) {
        e.subject.each(function(n){
                console.log(n.data.key);
           });
    })
监听线生成事件
//添加监听线生成事件
    myDiagram.addDiagramListener("LinkDrawn", function(e) {
           console.log(e.subject.data.to);

    })
监听删除事件
//监听节点删除事件
    myDiagram.addDiagramListener("SelectionDeleted", function(e) {
            e.subject.each(function(n){
                console.log(n.data.key);
           });
    })

2、Gooflow实现

  • 页面顶部栏、左边侧边栏均可自定义;

  • 当左边的侧边栏设为不显示时,为只读状态,此时的视图区可当作是一个查看器而非编辑器。

  • 侧边工具栏除了基本和一些流程节点按钮外,还自定义新的节点按钮,自定义节点都可以有自有的图标、类型名称,定义后在使用可可在工作区内增加这些自定义节点。

  • 顶部栏可显示流程图数据组的标题,也可提供一些常用操作按钮。

  • 顶部栏的按钮,除了撤销、重做按钮外,其余按钮均可自定义点击事件。

  • 可画直线、折线;折线还可以左右/上下移动其中段。

  • 具有区域划分功能,能让用户更直观地了解哪些节点及其相互间的转换,是属于何种自定义区域内的。

  • 具有标注功能,用橙红色标注某个结点或者转换线,一般用在展示流程进度时。

  • 能直接双击结点、连线、分组区域中的文字进行编辑

  • 在对结点、连线、分组区域的各种编辑操作,如新增/删除/修改名称/重设样式或大小/移动/标注时,均可捕捉到事件,并触发自定义事件,如果自定义事件执行的方法返回FALSE,则会阻止操作。

  • 具有操作事务序列控制功能,在工作区内的各种有效操作都能记录到一个栈中,然后可以进行撤销(undo())或重做(redo()),像典型的C/S软件一样。

  • 0.8版,取消原来的拟物化页面,变成如今的扁平化页面,并且支持主要位置的颜色自定义功能(如果想沿用原来老版本中的拟物化页面,只需保留原来的GooFlow.css文件即可);修正0.7版中的画线BUG。

 

3、Gooflow界面

图片 1

如上图所示:工作区宽度高度均为可见区的2倍,X,Y轴的方向如图所示,于CSS样式中顶距top和左距left是一样的;

左边是流程图绘制工具栏,从上至下依次为:选择指针、转换连接线、开始节点、结束节点、任务节点、自动节点、决策节点、状态节点、扩展附加节点、分支结点、聚合结点、复合子流程结点;最后一个不是节点,而是节点连线编辑与分组区域编辑两种工作区状态的切换开关,当切换至分组区域编辑后,只能操作分组区域块,节点与连线都被锁定;反之即然。

顶部是展示流程图标题和放置一些功能按钮的操作栏,这些按钮除了系统自带的外,还可由用户自定义。

如果初始化中设置不要左边工具栏和顶部的操作按钮,则该UI就变成了一个流程图查看/跟踪器。

图片 2

开始节点、结束节点为圆形,复合节点是绿色,其余结点均是淡蓝色圆角矩形,双击节点中的文字,可直接进行编辑;

转换连线和直接和中段可上下移动的折线、中段可左右移动的折线共三种样式,双击线条可直接编辑线条的文字说明内容;

分组区域需要左下角的开关被按下后才可编辑,有四种随机颜色,点击左上角的圆形图标后可改变颜色,双击文本可直接编辑。

节点被选中时:4、Goolflow构造函数

图片 3

这里color可配置的主要部分的颜色,分别为:绘图器HEAD/图标的颜色、结点背景色、连线/结点选中时边框颜色、连线被选中/元素都标注时颜色、复合结点自定义背景颜色、字体颜色。

如果这些都不定义,则自动使用默认颜色。

go.Shape属性(形状)

圆角矩形 RoundedRectangle  
 更多请查看API  https://gojs.net/latest/intro/shapes.html
 

5、Gooflow对象内部属性

如有需要了解的可在附件中查看

6、Gooflow数据格式

{
    "title":"普通稿件审核流程",
    "initNum":10,
    "nodes":{
       "appFlow_node_1":{"name":"开始","left":84,"top":196,"type":"task","width":86,"height":24},
       "appFlow_node_2":{"name":"普通编辑审核","left":261,"top":39,"type":"task","width":108,"height":28},
       "appFlow_node_3":{"name":"编辑主任审核","left":444,"top":197,"type":"task","width":96,"height":26},
       "appFlow_node_4":{"name":"值班主任","left":616,"top":37,"type":"task","width":88,"height":25},
       "appFlow_node_5":{"name":"结束","left":772,"top":202,"type":"task","width":84,"height":22}
   },
    "lines":{
       "appFlow_line_6":{"type":"sl","from":"appFlow_node_1","to":"appFlow_node_2","name":"采写","marked":false},
       "appFlow_line_7":{"type":"sl","from":"appFlow_node_2","to":"appFlow_node_3","name":"初审","marked":false},
       "appFlow_line_8":{"type":"sl","from":"appFlow_node_3","to":"appFlow_node_4","name":"再审","marked":false},
       "appFlow_line_9":{"type":"sl","from":"appFlow_node_4","to":"appFlow_node_5","name":"结束流转","marked":false}
    },
    "areas":{
       "demo_area_8": {"name":"area_8","left":35,"top":20,"color":"red","width":850,"height":220}
    }
 }

编辑:计算机教程 本文来源:基于jquery的web在线流程图设计器gooFlow,jquerygoo

关键词: