1. 程式人生 > >jsplumb學習(一)---初識jsplumb

jsplumb學習(一)---初識jsplumb

   七月開始實習工作了,一來到公司就要接觸聽都沒聽過的ETL專案,唉,什麼是ETL啊?還是不管吧,作為一名開發人員,懂的開發,能完成需求就差不多了,還是認真鼓搗一下自己的程式碼吧。

   接觸流程設計器這個概念就是從ETL開始的,當時公司採用的是myFlow來作為流程設計器的首要開發源庫,所以剛上手的時候也鼓搗了下myFlow.講真,myFlow確實封裝了很多方便的操作方法,但是整個專案下來,公司大牛們都覺得整體樣式不好看,於是就採用了另一個流程設計器庫jsPlumb,廢話不多說,先來看看jsPlumb到底是什麼。

  基本概念:

1.anchor(錨點)

   坐落在一個元素身上,用於多個元素之間相互連線的點,主要分為以下四類:

  • 靜態 - 這些固定在元素上的某個點上,不能移動。可以使用字串來指定它們,以確定jsPlumb所附帶的預設值,或描述該位置的陣列
  • 動態 - 這是靜態錨的列表,每次連線繪製時,jsPlumb從中選擇最合適的點。
  • 周長錨 - 這些錨點符合某些給定形狀的周長。它們在本質上是動態錨,其位置從底層形狀的周邊中選擇。
  • 連續錨 - 這些錨不固定在任何特定位置; 它們被分配到元素的四個面之一,這取決於該元素與關聯連線中另一個元素的方向。
2.connector(聯結器)

   聯結器是實際連線UI元素的線。jsPlumb有四個聯結器實現 - 一條直線,一個貝塞爾曲線,“流程圖”和“狀態機”。預設聯結器是Bezier曲線。


3.Endpoint(端點)

  一個Endpoint模型的的外觀

認識了幾個基本概念,接下來是官方的一個例項體驗下吧!

<!doctype html>
<html>
    <head>

        <title>jsPlumb - chart demonstration</title>
        <meta http-equiv="content-type" content="text/html;charset=utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"/>
        <link href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css" rel="stylesheet">
        <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
        <link href="//fonts.googleapis.com/css?family=Lato:400,700" rel="stylesheet">

        <link rel="stylesheet" href="../../css/jsPlumbToolkit-defaults.css">
        <link rel="stylesheet" href="../../css/main.css">
        <link rel="stylesheet" href="../../css/jsPlumbToolkit-demo.css">
        <link rel="stylesheet" href="demo.css">
    </head>
    <body data-demo-id="chart" data-library="dom">
    <div class="navbar navbar-top navbar-fixed-top" role="navigation">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>

                <a class="navbar-brand" href="/"><img src="../../img/logo-medium-jsplumb.png"></a>

            </div>

            <div class="navbar-collapse collapse nav-wrapper">
                <ul class="nav navbar-nav">
                    <li><a href="/">DEMOS</a></li>
                    <li><a href="/doc/home.html">DOCS</a></li>
                    <li><a href="/download">DOWNLOAD</a></li>
                    <li><a href="http://beta.jsplumbtoolkit.com/contact.html">CONTACT</a></li>
                    <li><a href="https://blog.jsplumbtoolkit.com">BLOG</a></li>
                </ul>

                <div class="apidoc-jsplumb-logo"><div class="container"><img src="/img/logo-docs-jsplumb.png"></div></div>

                <div class="social-nav hidden-xs">
                    <!--a href="#" class="link"><span class="icon-facebook"></span></a-->
                    <a href="http://twitter.com/jsplumblib" class="link"><span class="icon-twitter"></span></a>
                    <a href="http://github.com/sporritt/jsplumb/" class="link"><span class="icon-github"></span></a>
                    <a href="http://www.linkedin.com/company/jsplumb" class="link"><span class="icon-linkedin"></span></a>

                </div>
            </div><!--/.nav-collapse -->
        </div>
    </div>

        <div class="jtk-demo-main">
            <!-- demo -->
            <div class="jtk-demo-canvas canvas-wide chart-demo jtk-surface jtk-surface-nopan" id="canvas">
                <div class="window" id="chartWindow1">window one</div>
                <div class="window" id="chartWindow2">window two</div>
                <div class="window" id="chartWindow3">window three</div>
                <div class="window" id="chartWindow4">window four</div>
                <div class="window" id="chartWindow5">window five</div>
                <div class="window" id="chartWindow6">window six</div>
            </div>
            <!-- /demo -->
            <!-- explanation -->
            <div class="description">
                <h4>CHART</h4>
                <p>This is a simple demonstration of using jsPlumb to display hierarchical information.</p>
                <p>Connectors have a paintStyle of `gray` and specify an endpoint of radius 9.
                    Each connection has an Arrow overlay indicating direction, and paints itself orange on mouse hover.
                </p>
                <p>The Bezier curve used in this demo has a 'curviness' of 50</p>
            </div>
            <!-- /explanation -->
        </div>

        <!-- JS -->
        <!-- support lib for bezier stuff -->
        <script src="../../lib/jsBezier-0.8.js"></script>
        <!-- event adapter -->
		<script src="../../lib/mottle-0.7.4.js"></script>
		<!-- geometry functions -->
        <script src="../../lib/biltong-0.3.js"></script>
		<!-- drag -->
        <script src="../../lib/katavorio-0.18.0.js"></script>
        <!-- jsplumb util -->
        <script src="../../src/util.js"></script>
        <script src="../../src/browser-util.js"></script>
        <!-- main jsplumb engine -->
        <script src="../../src/jsPlumb.js"></script>
        <!-- base DOM adapter -->
        <script src="../../src/dom-adapter.js"></script>
        <script src="../../src/overlay-component.js"></script>
        <!-- endpoint -->
        <script src="../../src/endpoint.js"></script>
        <!-- connection -->
        <script src="../../src/connection.js"></script>
        <!-- anchors -->
        <script src="../../src/anchors.js"></script>
        <!-- connectors, endpoint and overlays  -->
        <script src="../../src/defaults.js"></script>
        <!-- bezier connectors -->
        <script src="../../src/connectors-bezier.js"></script>
        <!-- state machine connectors -->
        <script src="../../src/connectors-statemachine.js"></script>
        <!-- flowchart connectors -->
        <script src="../../src/connectors-flowchart.js"></script>
        <!-- straight connectors -->
        <script src="../../src/connectors-straight.js"></script>
        <!-- SVG renderer -->
        <script src="../../src/renderers-svg.js"></script>

        <!-- common adapter -->
        <script src="../../src/base-library-adapter.js"></script>
        <!-- no library jsPlumb adapter -->
        <script src="../../src/dom.jsPlumb.js"></script>
        <!-- /JS -->

		<!--  demo code -->
		<script src="demo.js"></script>

        <script src="../demo-list.js"></script>

    </body>
</html>
jsPlumb.ready(function () {

    var color = "gray";

    var instance = jsPlumb.getInstance({
        // notice the 'curviness' argument to this Bezier curve.  the curves on this page are far smoother
        // than the curves on the first demo, which use the default curviness value.
        Connector: [ "Bezier", { curviness: 50 } ],
        DragOptions: { cursor: "pointer", zIndex: 2000 },
        PaintStyle: { stroke: color, strokeWidth: 2 },
        EndpointStyle: { radius: 9, fill: color },
        HoverPaintStyle: {stroke: "#ec9f2e" },
        EndpointHoverStyle: {fill: "#ec9f2e" },
        Container: "canvas"
    });

    // suspend drawing and initialise.
    instance.batch(function () {
        // declare some common values:
        var arrowCommon = { foldback: 0.7, fill: color, width: 14 },
        // use three-arg spec to create two different arrows with the common values:
            overlays = [
                [ "Arrow", { location: 0.7 }, arrowCommon ],
                [ "Arrow", { location: 0.3, direction: -1 }, arrowCommon ]
            ];

        // add endpoints, giving them a UUID.
        // you DO NOT NEED to use this method. You can use your library's selector method.
        // the jsPlumb demos use it so that the code can be shared between all three libraries.
        var windows = jsPlumb.getSelector(".chart-demo .window");
        for (var i = 0; i < windows.length; i++) {
            instance.addEndpoint(windows[i], {
                uuid: windows[i].getAttribute("id") + "-bottom",
                anchor: "Bottom",
                maxConnections: -1
            });
            instance.addEndpoint(windows[i], {
                uuid: windows[i].getAttribute("id") + "-top",
                anchor: "Top",
                maxConnections: -1
            });
        }
        debugger;
        var conn = instance.connect({uuids: ["chartWindow3-bottom", "chartWindow6-top" ], overlays: overlays, detachable: true, reattach: true});
        instance.connect({uuids: ["chartWindow1-bottom", "chartWindow2-top" ], });
        instance.connect({uuids: ["chartWindow1-bottom", "chartWindow3-top" ], overlays: overlays});
        instance.connect({uuids: ["chartWindow2-bottom", "chartWindow4-top" ], overlays: overlays});
        instance.connect({uuids: ["chartWindow2-bottom", "chartWindow5-top" ], overlays: overlays});

        instance.draggable(windows);

    });

    jsPlumb.fire("jsPlumbDemoLoaded", instance);
});

.demo {
    /* for IE10+ touch devices */
    touch-action:none;
}

/** ELEMENTS **/
.chart-demo .window { 
	border:0.1em dotted #d4e06b; 	
	width:14em; height:4em; 	
	line-height:4em;	
}

/** HOVER EFFECTS **/
.chart-demo .window:hover, .chart-demo .window.jtk-source-hover, .chart-demo .window.jtk-target-hover {
    border:1px solid orange;
    color:orange;
}

/** ELEMENT POSITIONS **/
#chartWindow1 { left:20em; top:6em;}
#chartWindow2 { left:10em;top:18em;}
#chartWindow3 { left:40em;top:18em;}
#chartWindow4 { left:4em;top:30em;}
#chartWindow5 { left:22em;top:30em;}
#chartWindow6 { left:47em;top:30em;}
#chartWindow7 { top:18em;left:46em;}
#chartWindow8 { left:63em;top:38em;}


.window {
    background-color:white;
    border:1px solid #346789;
    text-align:center;
    z-index:24;
    cursor:pointer;
    box-shadow: 2px 2px 19px #aaa;
    -o-box-shadow: 2px 2px 19px #aaa;
    -webkit-box-shadow: 2px 2px 19px #aaa;
    -moz-box-shadow: 2px 2px 19px #aaa;
    -moz-border-radius:0.5em;
    border-radius:0.5em;
    position:absolute;
    color:black;
    padding:0.5em;
    width:80px;
    height:80px;
    line-height: 80px;
    -webkit-transition: -webkit-box-shadow 0.15s ease-in;
    -moz-transition: -moz-box-shadow 0.15s ease-in;
    -o-transition: -o-box-shadow 0.15s ease-in;
    transition: box-shadow 0.15s ease-in;
}

.window:hover {
    border:1px solid #123456;
    box-shadow: 2px 2px 19px #444;
    -o-box-shadow: 2px 2px 19px #444;
    -webkit-box-shadow: 2px 2px 19px #444;
    -moz-box-shadow: 2px 2px 19px #fff;
    opacity:0.9;
}

path, .jtk-endpoint { cursor:pointer; }

感覺效果挺不錯的,實現也挺簡單,今天就先這樣,接下來就設計一個設計器。
整個流程設計器的實現已在github中,有興趣可以先看看
https://github.com/oOKevinOo/myJsplumb