【angular-gojs使用笔记】gojs-angular的基本使用。

文章介绍了如何在Angular应用中使用GoJS库创建图表和调色板组件,包括安装gojs-angular库,定义图表和调色板的初始化方法,以及处理模型变化事件。示例代码展示了组件的配置和样式设置,强调了需要禁用特定封装模式以使样式生效。
摘要由CSDN通过智能技术生成

最近需要用到gojs与angular进行一些需求的开发。

根据官网https://gojs.net/latest/intro/angular.html的这篇GoJS with Angular使用说明,除了gojs库本身外,还需安装gojs-angular这个库,使用以下命令完成安装:

npm install gojs gojs-angular

gojs-angular提供了三个angular组件,分别是gojs-diagram、gojs-palette和gojs-overview。
gojs-diagram提供以下API:

参数说明类型
[initDiagram]图表初始化方法,需要返回一个go.Diagram实例(不能在方法中初始化数据模型)() => go.Diagram
[nodeDataArray]node数据Array<go.ObjectData>
[linkDataArray]link数据(可选)Array<go.ObjectData>
[modelData]model数据(可选)go.ObjectData
[divClassName]图表div的类名,通过此类名可以控制图表的样式string
[skipsDiagramUpdate]是否合并app数据和model数据boolean
(modelChange)图表Model改变时触发EventEmitter<go.IncrementalData>

gojs-palette提供以下API:

参数说明类型
(initPalette)调色板初始化方法() => go.Palette
(nodeDataArray)node数据Array<go.ObjectData>
(linkDataArray)link数据(可选Array<go.ObjectData>
(modelData)model数据(可选)go.ObjectData
(divClassName)调色板div的类名,通过此类名可以控制图表的样式boolean
[modelChange]Model改变时触发EventEmitter<go.IncrementalData>

复制示例的代码进项目中,需要注意在@Component中将encapsulation属性设置为ViewEncapsulation.ShadowDom或ViewEncapsulation.None,不然通过divClassName属性设置的样式无法起到作用。

// app.component.ts
import { Component, ViewEncapsulation } from '@angular/core';
import * as go from 'gojs';
@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.less'],
  encapsulation: ViewEncapsulation.ShadowDom,
})
export class AppComponent {
  title = 'GoJs-angular';

  // Big object that holds app-level state data
  // As of gojs-angular 2.0, immutability is required of state for change detection
  state = {
    // Diagram state props
    diagramNodeData: [
      { id: 'Alpha', text: 'Alpha', color: 'lightblue' },
      { id: 'Beta', text: 'Beta', color: 'orange' },
    ],
    diagramLinkData: [{ key: -1, from: 'Alpha', to: 'Beta' }],
    diagramModelData: { prop: 'value' },
    skipsDiagramUpdate: false,

    // Palette state props
    paletteNodeData: [
      { key: 'PaletteNode1', color: 'firebrick' },
      { key: 'PaletteNode2', color: 'blueviolet' },
    ],
  }; // end state object

  diagramDivClassName: string = 'myDiagramDiv';
  paletteDivClassName = 'myPaletteDiv';

  // initialize diagram / templates
  initDiagram(): go.Diagram {
    const $ = go.GraphObject.make;
    const dia = $(go.Diagram, {
      'undoManager.isEnabled': true,
      model: new go.GraphLinksModel({
        nodeKeyProperty: 'id',
        linkKeyProperty: 'key', // IMPORTANT! must be defined for merges and data sync when using GraphLinksModel
      }),
    });

    // define the Node template
    dia.nodeTemplate = $(
      go.Node,
      'Auto',
      $(
        go.Shape,
        'RoundedRectangle',
        { stroke: null },
        new go.Binding('fill', 'color')
      ),
      $(
        go.TextBlock,
        { margin: 8, editable: true },
        new go.Binding('text').makeTwoWay()
      )
    );
    return dia;
  }

  /**
   * Handle GoJS model changes, which output an object of data changes via Mode.toIncrementalData.
   * This method should iterate over thoe changes and update state to keep in sync with the FoJS model.
   * This can be done with any preferred state management method, as long as immutability is preserved.
   */
  diagramModelChange = function (changes: go.IncrementalData) {
    console.log(changes);
    // see gojs-angular-basic for an example model changed handler that preserves immutability
    // when setting state, be sure to set skipsDiagramUpdate: true since GoJS already has this update
  };

  initPalette(): go.Palette {
    const $ = go.GraphObject.make;
    const palette = $(go.Palette);

    // define the Node template
    palette.nodeTemplate = $(
      go.Node,
      'Auto',
      $(
        go.Shape,
        'RoundedRectangle',
        { stroke: null },
        new go.Binding('fill', 'color')
      ),
      $(go.TextBlock, { margin: 8 }, new go.Binding('text', 'key'))
    );

    palette.model = new go.GraphLinksModel({
      linkKeyProperty: 'key', // IMPORTANT! must be defined for merges and data sync when using GraphLinksModel
    });

    return palette;
  }
}

<!-- app.component.html -->
<gojs-diagram
  [initDiagram]='initDiagram'
  [nodeDataArray]='state.diagramNodeData'
  [linkDataArray]='state.diagramLinkData'
  [modelData]='state.diagramModelData'
  [skipsDiagramUpdate]='state.skipsDiagramUpdate'
  (modelChange)='diagramModelChange($event)'
  [divClassName]='diagramDivClassName'
  >
</gojs-diagram>

<gojs-palette
  [initPalette]='initPalette'
  [nodeDataArray]='state.paletteNodeData'
  [divClassName]='paletteDivClassName'>
</gojs-palette>
/* 不为组件设置长宽则无法显示。 */
.myDiagramDiv {
  background: whitesmoke;
  width: 800px;
  height: 300px;
  border: 1px solid black;
}

.myPaletteDiv{
  background: whitesmoke;
  width: 800px;
  height: 300px;
  border: 1px solid black;
}

随后可以在页面上看到如下显示:
在这里插入图片描述
在上方的是gojs-diagram组件渲染的内容,其中的元素可以随意拖动、删除和修改。
下方的则是gojs-palette渲染的内容,palette直译为调色板,在视图上操作没有上方的图表那样自由,但可以将其中的元素拖入上方图表中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值