拓扑图编辑器-jsplumb连接

了解安装和相关配置后,开始连线。

注:以下代码全部使用jsPlumb调用api,开发过程中最好用上文提到的getInstance方法生成jsPlumb的独立实例调用api。

程序化连接
jsPlumb.connect({source:"element1", target:"element2"});

创建了一个从'element1'到'element2'的连接。jsPlumb.connect方法的参数可以设置源端点、目标端点、锚点、端点样式等,若没有设置会显示默认值:

  • 端点(Endpoint):默认是“Dot”,半径为10,填充颜色为“#456”
  • 锚点(Anchors):默认是Bottom
  • 连接器(Connector):默认值为“Bezier”连接器,线宽8px,颜色为“#456”

因此,这个调用的渲染效果为:
一个8px Bezier,颜色为“#456”,从'element1'的底部中心到'element2'的底部中心的连线,每个Endpoint都是一个10px半径的Dot Endpoint,颜色为“#456”。

增加一些配置:

jsPlumb.connect({
  source:"element1", 
  target:"element2",
  anchors:["Right", "Left" ],
  endpoint:"Rectangle",
  endpointStyle:{ fill: "yellow" }
});
连接类型

当鼠标放在连接上或者点击连接,希望连接改变样式时,可以通过设置连接类型实现。
端点或连接可以分配零个或多个类型,它们按照分配顺序尽可能精细地合并。支持的API:

  • hasType
  • addType
  • removeType
  • toggleType
  • setType
  • clearTypes

(1) 点击连接时,设置连接example提供的样式:

jsPlumb.registerConnectionType("example", {
  paintStyle:{ stroke:"blue", strokeWidth:5  },
  hoverPaintStyle:{ stroke:"red", strokeWidth:7 }
});

var c = jsPlumb.connect({ source:"someDiv", target:"someOtherDiv" });
c.bind("click", function() {
  c.setType("example"); 
}); 

(2) 点击连接时切换连接样式:

jsPlumb.registerConnectionTypes({
  "basic": {
    paintStyle:{ stroke:"blue", strokeWidth:5  },
    hoverPaintStyle:{ stroke:"red", strokeWidth:7 },
    cssClass:"connector-normal"
  },
  "selected":{
    paintStyle:{ stroke:"red", strokeWidth:5 },
    hoverPaintStyle:{ strokeWidth: 7 },
    cssClass:"connector-selected"
  } 
});

var c = jsPlumb.connect({ source:"someDiv", target:"someOtherDiv", type:"basic" });

c.bind("click", function() {
  c.toggleType("selected");
});

(3) 完整的API示例:

jsPlumb.registerConnectionTypes({
  "foo":{ paintStyle:{ stroke:"yellow", strokeWidth:5, cssClass:"foo" } },
  "bar":{ paintStyle:{ stroke:"blue", strokeWidth:10 } },
  "baz":{ paintStyle:{ stroke:"green", strokeWidth:1, cssClass:"${clazz}" } },
  "boz":{ paintStyle: { stroke:"${color}", strokeWidth:"${width}" } }
});

var c = jsPlumb.connect({ 
  source:"someDiv", 
  target:"someOtherDiv", 
  type:"foo" 
});

// see what types the connection has.  
console.log(c.hasType("foo"));  // -> true
console.log(c.hasType("bar"));  // -> false

// add type 'bar'
c.addType("bar");

// toggle both types (they will be removed in this case)
c.toggleType("foo bar");

// toggle them back
c.toggleType("foo bar");

// getType returns a list of current types.
console.log(c.getType()); // -> [ "foo", "bar" ]

// set type to be 'baz' only
c.setType("baz");

// add foo and bar back in
c.addType("foo bar");

// remove baz and bar
c.removeType("baz bar");

// what are we left with? good old foo.
console.log(c.getType()); // -> [ "foo" ]

// now let's add 'boz', a parameterized type
c.addType("boz", {
  color:"#456",
  width:35
});

console.log(c.getType()); // -> [ "foo", "boz" ]

// now clear all types
c.clearTypes();

console.log(c.getType()); // -> [  ]

注:除了hasType之外的每个方法都可以使用以空格分隔的类型列表来处理

(4) 连接类型对象中支持的参数
连接类型并非支持Connection中的每个参数 ,以下是连接类型对象中支持的属性列表:

  • anchor: 用于连接的两端
  • anchors: 用于连接的每一端
  • detachable: 连接是否可以使用鼠标拆卸
  • paintStyle:
  • hoverPaintStyle:
  • scope:
  • cssClass: 用于设置连接器元素的类
  • parameters: - 当添加/设置具有参数的Type时,将覆盖具有相同键的任何现有参数。删除具有参数的Type时,不会从连接器中删除其参数
  • overlays: - 将多个类型应用于连接器时,将获得跨各种类型定义的所有overlays的并集。注意当使用jsPlumb.connect创建连线并提供'type'时,相当于调用'addType',将获得设置的Type和提供的任何其他类型定义的Overlays构造函数
  • endpoint
删除节点
  • jsPlumb.remove
    从DOM中删除元素,与元素关联的Connections和Endpoints也会被删除。
var conn = jsPlumb.connect({source:"element1", target:"element2"});
jsPlumb.remove("element1");

*jsPlumb.empty
将删除某个元素下的所有子元素,以及与子元素关联的Connections和Endpoints

<ul id="list">
  <li id="one">One</li>
</ul>

var conn = jsPlumb.connect({source:"one", target:"someOtherElement"});
...
jsPlumb.empty("list");

注:除了hasType之外的每个方法都可以使用以空格分隔的类型列表来处理

端点类型

可以在创建时以编程方式为端点分配一个或多个类型。
端点和连接类型之间唯一真正的区别是允许的参数。端点列表:

  • paintStyle
  • endpointStyle: 如果paintStyle提供此选项,则优先
  • hoverPaintStyle
  • endpointHoverStyle: 如果hoverPaintStyle提供此项,则优先
  • MaxConnections
  • connectorStyle: 使用此端点的任何连接器的样式
  • connectorHoverStyle: 从此端点悬停连接的绘制样式
  • connector: 连接器定义,比如: StateMachine或[ "Flowchart", { stub:50 } ]
  • connectionType: 这允许您指定从此端点进行的连接的连接类型。
  • scope: 端点只支持一个范围。因此,如果应用了多个类型,则将从定义一个类型的最后一个类型中获取范围
  • cssClass: 与连线的CSS类相同
  • parameters: 当添加/设置具有参数的Type时,将覆盖具有相同键的任何现有参数。删除具有参数的Type时,不会从连接器中删除其参数。
  • overlays: 将多个类型应用于端点时,将获得跨各种类型定义的所有overlays的并集。
    注:传递给Connections的参数只对源端点生效,目标端点不生效
    使用端点类型的示例:
jsPlumb.registerEndpointTypes({
  "basic":{         
    paintStyle:{fill:"blue"}
  },
  "selected":{          
    paintStyle:{fill:"red"}
  }
});

var e = jsPlumb.addEndpoint("someElement", {
  anchor:"TopMiddle",
  type:"basic"
});

e.bind("click", function() {
  e.toggleType("selected");
});

注: 不会影响现有的Connections,仅影响在端点上设置新类型后创建的Connections

删除连接
删除单个连接
var conn = jsPlumb.connect({source:"element1", target:"element2"});
jsPlumb.detach(conn);

调用jsPlumb.detach删除连接时,与该连接关联的端点会不会被删除,取决于建立连接的方式。
以下情况,端点被删除:

  • 使用jsPlumb.connect创建连接,没有设置deleteEndpointsOnDetach: false
  • 连接由用户在配置的元素上通过鼠标创建的,该元素makeSource没有设置deleteEndpointsOnDetach: false。

以下情况,端点不被删除:

  • 使用jsPlumb.connect创建连接,设置deleteEndpointsOnDetach: false
  • 端点由addEndpoint创建,连接由用户通过鼠标创建
  • 连接由用户在配置的元素上通过鼠标创建的,该元素makeSource设置deleteEndpointsOnDetach: false
单个元素中删除所有连接
jsPlumb.deleteConnectionsForElement(el, [params])

el可以是:

  • 表示元素id的String
  • 一个DOM元素
  • 表示单个元素的选择器

params是可选的,可能包含:
fireEvent - 是否触发断开连接事件。默认值为true。
注:端点被删除情况同上

连接所有连接
jsPlumb.detachEveryConnection();

注:端点被删除情况同上

删除端点
删除单个端点
var ep = jsPlumb.addEndpoint(someElement, { ... });
...
jsPlumb.deleteEndpoint(ep);

ep可以是:

  • 一个String,表示端点的UUID(添加端点时,可以为该端点设置uuid)
  • 一个实际的Endpoint对象(如上所示)
删除所有端点
jsPlumb.deleteEveryEndpoint();

注:该方法会删除所有端点和所有连接

选择并操作Connections列表
选择并操作端点列表

参考:
http://jsplumb.github.io/jsplumb/overlays.html

下一篇:拓扑图编辑器-jsplum事件

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容