将Angular 4与GOJS整合在一起



有人可以帮助我将此代码转换为Angular 4吗?我已经尝试了最小的工作,但是当涉及流程图时,缺少某些东西,我找不到。

这是我已附加的component.ts文件。

诸如save()和load()之类的功能不起作用。因为document.getElementById。

如何将其更改为Angular 4服务。

html代码:

  <div id="sample">
        <div style="width: 100%; white-space: nowrap;">
            <span style="display: inline-block; vertical-align: top; width: 100px">
                <div id="myPaletteDiv" style="border: solid 1px black; height: 720px"></div>
            </span> <span style="display: inline-block; vertical-align: top; width: 80%">
                <h1>Hello {{name}}</h1>
                <div align="center" #myDiagramDiv
                    style="border: solid blue 1px; width: 1000px; height: 1000px"></div>
            </span>
        </div>
        <p>
        </p>
        <button id="SaveButton" (click)="save()">Save</button>
        <button (click)="load()">Load</button>
        Diagram Model saved in JSON format:
        <p>
        </p>
        <textarea id="mySavedModel" style="width: 100%; height: 300px">{ "class": "go.GraphLinksModel",
     "linkFromPortIdProperty": "fromPort",
     "linkToPortIdProperty": "toPort",
     "nodeDataArray": [ 
    {"key":-1, "category":"Start", "loc":"175 0", "text":"Start"},
    {"key":1, "loc":"175 100", "text":"Entity: Amount"},
    {"key":6, "loc":"175.13616240146848 297.0937263794408", "text":"Entity: Account Number"},
    {"key":-2, "category":"End", "loc":"159.17859842349642 758.71806500378", "text":"End"},
    {"text":"Amount == 100", "figure":"Diamond", "key":-3, "loc":"174.8125 189.4553503941259"},
    {"text":"Account Number == 123456", "figure":"Diamond", "key":-6, "loc":"173.084824802937 389.8656732534283"},
    {"key":-7, "loc":"173.40848720440562 527.7383651873449", "text":"Entity: Pin Number"},
    {"text":"Pin Number <= 1234", "figure":"Diamond", "key":-8, "loc":"173.94866240146834 653.3361408055284"}
    ],
     "linkDataArray": [ 
    {"from":-1, "to":1, "fromPort":"B", "toPort":"T", "points":[175,24.773340092148892,175,34.77334009214889,175,54.16780789397485,175.0000000000001,54.16780789397485,175.0000000000001,73.5622756958008,175.0000000000001,83.5622756958008]},
    {"from":1, "to":-3, "fromPort":"B", "toPort":"T", "points":[175.0000000000001,116.43772430419924,175.0000000000001,126.43772430419924,175.0000000000001,136.75881304496335,174.8125,136.75881304496335,174.8125,147.07990178572746,174.8125,157.07990178572746]},
    {"from":-3, "to":6, "fromPort":"B", "toPort":"T", "visible":true, "points":[174.8125,221.83079900252432,174.8125,231.83079900252432,174.8125,247.27453838678335,175.13616240146848,247.27453838678335,175.13616240146848,262.7182777710424,175.13616240146848,272.7182777710424]},
    {"from":6, "to":-6, "fromPort":"B", "toPort":"T", "points":[175.13616240146848,321.46917498783927,175.13616240146848,331.46917498783927,175.13616240146848,331.54197551223535,173.084824802937,331.54197551223535,173.084824802937,331.61477603663144,173.084824802937,341.61477603663144]},
    {"from":-6, "to":-7, "fromPort":"B", "toPort":"T", "visible":true, "points":[173.084824802937,438.11657047022516,173.084824802937,448.11657047022516,173.084824802937,474.70860567668547,173.40848720440562,474.70860567668547,173.40848720440562,501.3006408831457,173.40848720440562,511.3006408831457]},
    {"from":-6, "to":1, "fromPort":"R", "toPort":"R", "visible":true, "points":[328.8833477521557,389.8656732534283,338.8833477521557,389.8656732534283,338.8833477521557,100.00000000000003,292.4533048880408,100.00000000000003,246.0232620239259,100.00000000000003,236.0232620239259,100.00000000000003], "text":"No"},
    {"from":-3, "to":-7, "fromPort":"L", "toPort":"L", "visible":true, "points":[53.215850830078125,189.4553503941259,43.215850830078125,189.4553503941259,44,189.4553503941259,44,189.4553503941259,4,189.4553503941259,4,452,36,452,36,527.7383651873449,88.93497646221812,527.7383651873449,98.93497646221812,527.7383651873449], "text":"No"},
    {"from":-7, "to":-8, "fromPort":"B", "toPort":"T", "points":[173.40848720440562,544.1760894915442,173.40848720440562,554.1760894915442,173.40848720440562,582.568390844337,173.94866240146834,582.568390844337,173.94866240146834,610.96069219713,173.94866240146834,620.96069219713]},
    {"from":-8, "to":-7, "fromPort":"R", "toPort":"R", "visible":true, "points":[330.5989919913121,653.3361408055284,340.5989919913121,653.3361408055284,340.5989919913121,527.7383651873449,299.2404949689526,527.7383651873449,257.8819979465931,527.7383651873449,247.88199794659312,527.7383651873449], "text":"No"},
    {"from":-8, "to":-2, "fromPort":"B", "toPort":"T", "visible":true, "points":[173.94866240146834,685.7115894139268,173.94866240146834,695.7115894139268,173.94866240146834,711.9038126785827,159.1785984234963,711.9038126785827,159.1785984234963,728.0960359432383,159.1785984234963,738.0960359432383]}
    ]}
      </textarea>
    </div>

打字稿代码:

import {Component, ElementRef, AfterViewInit, ViewChild} from '@angular/core';
import * as go from "gojs";
@Component({
  selector: 'app-flowchart',
  templateUrl: './flowchart.component.html',
  styleUrls: ['./flowchart.component.css']
})
export class FlowchartComponent implements AfterViewInit {
  name = 'GoJS';
  @ViewChild('myDiagramDiv')
  element: ElementRef;
  ngAfterViewInit() {
    const $ = go.GraphObject.make;
    const myDiagram: go.Diagram = $(go.Diagram, this.element.nativeElement,
      {
        initialContentAlignment: go.Spot.Center,  // center the content
        "undoManager.isEnabled": true  // enable undo & redo
      });

    const myPalette: go.Palette =
      $(go.Palette, "myPaletteDiv",  // must name or refer to the DIV HTML element
        {
          "animationManager.duration": 800, // slightly longer than default (600ms) animation
          nodeTemplateMap: myDiagram.nodeTemplateMap,  // share the templates used by myDiagram
          model: new go.GraphLinksModel([  // specify the contents of the Palette
            {category: "Start", text: "Start"},
            {text: "Step"},
            {text: "???", figure: "Diamond"},
            {category: "End", text: "End"},
            {category: "Comment", text: "Comment"}
          ])
        });

    myDiagram.nodeTemplate =
      $(go.Node, "Auto",
        $(go.Shape, "RoundedRectangle", {strokeWidth: 0},
          new go.Binding("fill", "color")),
        $(go.TextBlock,
          {margin: 8},
          new go.Binding("text", "key"))
      );

    myDiagram.addDiagramListener("Modified", function(e) {
      const button = <HTMLInputElement>document.getElementById("SaveButton");
      if (button) {
        button.disabled = !myDiagram.isModified;
      }
      const idx = document.title.indexOf("*");
      if (myDiagram.isModified) {
        if (idx < 0) {
          document.title += "*";
        }
      } else {
        if (idx >= 0) {
          document.title = document.title.substr(0, idx);
        }
      }
    });

    function nodeStyle() {
      return [
        // The Node.location comes from the "loc" property of the node data,
        // converted by the Point.parse static method.
        // If the Node.location is changed, it updates the "loc" property of the node data,
        // converting back using the Point.stringify static method.
        new go.Binding("location", "loc", go.Point.parse).makeTwoWay(go.Point.stringify),
        {
          // the Node.location is at the center of each node
          locationSpot: go.Spot.Center,
          // isShadowed: true,
          // shadowColor: "#888",
          //  handle mouse enter/leave events to show/hide the ports
          mouseEnter: function(e, obj) {showPorts(obj.part, true);},
          mouseLeave: function(e, obj) {showPorts(obj.part, false);}
        }
      ];
    }
    function makePort(name, spot, output, input) {
      // the port is basically just a small circle that has a white stroke when it is made visible
      return $(go.Shape, "Circle",
        {
          fill: "transparent",
          stroke: null,  // this is changed to "white" in the showPorts function
          desiredSize: new go.Size(8, 8),
          alignment: spot, alignmentFocus: spot,  // align the port on the main Shape
          portId: name,  // declare this object to be a "port"
          fromSpot: spot, toSpot: spot,  // declare where links may connect at this port
          fromLinkable: output, toLinkable: input,  // declare whether the user may draw links to/from here
          cursor: "pointer"  // show a different cursor to indicate potential link point
        });
    }

    const lightText = 'whitesmoke';
    myDiagram.nodeTemplateMap.add("",  // the default category
      $(go.Node, "Spot", nodeStyle(),
        // the main object is a Panel that surrounds a TextBlock with a rectangular Shape
        $(go.Panel, "Auto",
          $(go.Shape, "Rectangle",
            {fill: "#00A9C9", stroke: null},
            new go.Binding("figure", "figure")),
          $(go.TextBlock,
            {
              font: "bold 11pt Helvetica, Arial, sans-serif",
              stroke: lightText,
              margin: 8,
              maxSize: new go.Size(160, NaN),
              wrap: go.TextBlock.WrapFit,
              editable: true
            },
            new go.Binding("text").makeTwoWay())
        ),
        // four named ports, one on each side:
        makePort("T", go.Spot.Top, false, true),
        makePort("L", go.Spot.Left, true, true),
        makePort("R", go.Spot.Right, true, true),
        makePort("B", go.Spot.Bottom, true, false)
      ));
    myDiagram.nodeTemplateMap.add("Start",
      $(go.Node, "Spot", nodeStyle(),
        $(go.Panel, "Auto",
          $(go.Shape, "Circle",
            {minSize: new go.Size(40, 40), fill: "#79C900", stroke: null}),
          $(go.TextBlock, "Start",
            {font: "bold 11pt Helvetica, Arial, sans-serif", stroke: lightText},
            new go.Binding("text"))
        ),
        // three named ports, one on each side except the top, all output only:
        makePort("L", go.Spot.Left, true, false),
        makePort("R", go.Spot.Right, true, false),
        makePort("B", go.Spot.Bottom, true, false)
      ));
    myDiagram.nodeTemplateMap.add("End",
      $(go.Node, "Spot", nodeStyle(),
        $(go.Panel, "Auto",
          $(go.Shape, "Circle",
            {minSize: new go.Size(40, 40), fill: "#DC3C00", stroke: null}),
          $(go.TextBlock, "End",
            {font: "bold 11pt Helvetica, Arial, sans-serif", stroke: lightText},
            new go.Binding("text"))
        ),
        // three named ports, one on each side except the bottom, all input only:
        makePort("T", go.Spot.Top, false, true),
        makePort("L", go.Spot.Left, false, true),
        makePort("R", go.Spot.Right, false, true)
      ));
    myDiagram.nodeTemplateMap.add("Comment",
      $(go.Node, "Auto", nodeStyle(),
        $(go.Shape, "File",
          {fill: "#EFFAB4", stroke: null}),
        $(go.TextBlock,
          {
            margin: 5,
            maxSize: new go.Size(200, NaN),
            wrap: go.TextBlock.WrapFit,
            textAlign: "center",
            editable: true,
            font: "bold 12pt Helvetica, Arial, sans-serif",
            stroke: '#454545'
          },
          new go.Binding("text").makeTwoWay())
        // no ports, because no links are allowed to connect with a comment
      ));

    myDiagram.linkTemplate =
      $(go.Link,  // the whole link panel
        {
          routing: go.Link.AvoidsNodes,
          curve: go.Link.JumpOver,
          corner: 5, toShortLength: 4,
          relinkableFrom: true,
          relinkableTo: true,
          reshapable: true,
          resegmentable: true,
          // mouse-overs subtly highlight links:
          mouseEnter: function(e, link) {link.findObject("HIGHLIGHT").stroke = "rgba(30,144,255,0.2)";},
          mouseLeave: function(e, link) {link.findObject("HIGHLIGHT").stroke = "transparent";}
        },
        new go.Binding("points").makeTwoWay(),
        $(go.Shape,  // the highlight shape, normally transparent
          {isPanelMain: true, strokeWidth: 8, stroke: "transparent", name: "HIGHLIGHT"}),
        $(go.Shape,  // the link path shape
          {isPanelMain: true, stroke: "gray", strokeWidth: 2}),
        $(go.Shape,  // the arrowhead
          {toArrow: "standard", stroke: null, fill: "gray"}),
        $(go.Panel, "Auto",  // the link label, normally not visible
          {visible: false, name: "LABEL", segmentIndex: 2, segmentFraction: 0.5},
          new go.Binding("visible", "visible").makeTwoWay(),
          $(go.Shape, "RoundedRectangle",  // the label shape
            {fill: "#F8F8F8", stroke: null}),
          $(go.TextBlock, "Yes",  // the label
            {
              textAlign: "center",
              font: "10pt helvetica, arial, sans-serif",
              stroke: "#333333",
              editable: true
            },
            new go.Binding("text").makeTwoWay())
        )
      );
    function showPorts(node, show) {
      const diagram = node.diagram;
      if (!diagram || diagram.isReadOnly || !diagram.allowLink) {
        return;
      }
      node.ports.each(function(port) {
        port.stroke = (show ? "white" : null);
      });
    }
    function save() {
      (<HTMLInputElement>document.getElementById("mySavedModel")).value = myDiagram.model.toJson();
      myDiagram.isModified = false;
    }
    function load() {
      myDiagram.model = go.Model.fromJson((<HTMLInputElement>document.getElementById("mySavedModel")).value);
    }
    function showLinkLabel(e) {
      const label = e.subject.findObject("LABEL");
      if (label !== null) {
        label.visible = (e.subject.fromNode.data.figure === "Diamond");
      }
    }
    // temporary links used by LinkingTool and RelinkingTool are also orthogonal:
    myDiagram.toolManager.linkingTool.temporaryLink.routing = go.Link.Orthogonal;
    myDiagram.toolManager.relinkingTool.temporaryLink.routing = go.Link.Orthogonal;
    load();  // load an initial diagram from some JSON text
    // initialize the Palette that is on the left side of the page
    // The following code overrides GoJS focus to stop the browser from scrolling
    // the page when either the Diagram or Palette are clicked or dragged onto.
    function customFocus() {
      const x = window.scrollX || window.pageXOffset;
      const y = window.scrollY || window.pageYOffset;
      go.Diagram.prototype.doFocus.call(this);
      window.scrollTo(x, y);
    }
    myDiagram.doFocus = customFocus;
    myPalette.doFocus = customFocus;
    throw new Error("Method not implemented.");
  }
  // Show the diagram's model in JSON format that the user may edit
 }

我在Angular 4中有类似的代码。

根据代码共享MyDiagram内部的任何内容,在Angular Component的范围中不可用,并且无法从Angular Component或HTML调用Save()或load()。

您应该使用GOJS的事件触发器来处理这些触发器。很容易抓住gojs中的div元素,而不是试图在Angular内获取GOJS的mydiagram的引用。

 ngAfterViewInit() {
   var _this = this;
   function init() {
       var $ = go.GraphObject.make;
       //all your myDiagram initialization and functions goes here
       //listen to any changes and save the changes to Angular model
       myDiagram.addModelChangedListener(function (evt: any) {
            _this.saveTemplateData = myDiagram.model.toJson();
            myDiagram.isModified = false;
        });
       //listen for a object drag drop inside goJs canvas and capture it in angular component
      myDiagram.addDiagramListener("ExternalObjectsDropped", (e: any) => {
            _this.newObjectDropped(e.subject);
        });
   }
}

有数百个事件,例如上述示例。GOJS在可伸缩性并具有丰富功能时非常出色。

您可以在下面的链接中参考项目内部的Angular 2样本项目/Angular-sample。

https://gojs.net/latest/doc/download.html

此当然与上述代码不同,并将GOJS变成您的角度。

最新更新