经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » JS/JS库/框架 » go.js » 查看文章
gojs一些实用的高级用法
来源:jb51  时间:2022/1/2 10:24:27  对本文有异议

1. 取消更新动画

问题:更新数据的时候,会触发渲染,有渲染动画,用户体验不好。

方案:初始数据绘制,有动画;更新数据绘制,无动画。

代码实现:

  1. // 后面所用到的 diagram 都是 gojs 创建的实例
  2. // diagram_container 为图容器dom id
  3. diagram = $(go.Diagram, 'diagram_container')

方案一:

  1. function updateData (nodeArr = [], linkArr = [], hasAnimation = true ) {
  2. if (hasAnimation) {
  3. diagram.model = new go.GraphLinksModel(nodeArr, linkArr);
  4. } else {
  5. diagram.model.nodeDataArray = nodeArr
  6. diagram.model.linkDataArray = linkArr
  7. }
  8. }
  9.  
  10. // 初始化实例后处理,只用一次
  11. diagram.animationManager.canStart = function(reason) {
  12. if (reason === 'Model') return false
  13. return true
  14. }

方案二:

  1. // 绑定数据至 diagram,绘制图
  2. function updateData (nodeArr = [], linkArr = [], hasAnimation = true ) {
  3. if (hasAnimation) {
  4. diagram.model = new go.GraphLinksModel(nodeArr, linkArr);
  5. } else {
  6. diagram.model.nodeDataArray = nodeArr
  7. diagram.model.linkDataArray = linkArr
  8. diagram.animationManager.stopAnimation()
  9. }
  10. }

方案三:

  1. // 绑定数据至 diagram,绘制图
  2. function updateData (nodeArr = [], linkArr = [], hasAnimation = true) {
  3. diagram.model = new go.GraphLinksModel(nodeArr, linkArr);
  4. if (diagram.animationManager) {
  5. // Default 有动画,None 没有动画
  6. diagram.animationManager.initialAnimationStyle = hasAnimation ? go.AnimationManager.Default : go.AnimationManager.None;
  7. }
  8. }

2. 导出图(含可视区外的部分)

问题:导出图,利用原生 canvas 相关 api 实现的导出图片,只包含可视区内的

解决:利用 gojs 提供的 api 处理

背后原理:利用数据重新绘制一份图,所有数据节点都在的图可视区内,然后利用原生 canvas 相关 api 实现导出图片

代码实现:

  1. function downloadImg = ({
  2. imgName = 'dag',
  3. bgColor = 'white',
  4. imgType = 'image/png'
  5. }= {}) {
  6. diagram.makeImageData({
  7. scale: 2,
  8. padding: new go.Margin(50, 70),
  9. maxSize: new go.Size(Infinity, Infinity),
  10. background: bgColor,
  11. type: imgType,
  12. returnType: 'blob',
  13. callback: (blob: any) => {
  14. const url = window.URL.createObjectURL(blob)
  15. const fileName = imgName + '.png'
  16. const aEl = document.createElement('a')
  17. aEl.style.display = 'none'
  18. aEl.href = url
  19. aEl.download = fileName
  20.  
  21. // IE 11
  22. if (window.navigator.msSaveBlob !== undefined) {
  23. window.navigator.msSaveBlob(blob, fileName)
  24. return
  25. }
  26.  
  27. document.body.appendChild(aEl)
  28. requestAnimationFrame(function() {
  29. aEl.click()
  30. window.URL.revokeObjectURL(url)
  31. document.body.removeChild(aEl)
  32. })
  33. }
  34. })
  35. }

3. 禁用 ctrl 相关快捷键

  1. // 禁用 ctl 相关操作
  2. diagram.commandHandler.doKeyDown = function() {
  3. const e = diagram.lastInput
  4. const control = e.control || e.meta
  5. const key = e.key
  6.  
  7. // 取消 Ctrl+A/Z/Y/G A-全选、Z-撤销、Y-重做、G-分组
  8. if (control && ['A', 'Z', 'Y', 'G'].includes(key)) return
  9. // 取消 Del/Backspace 删除键
  10. if (key === 'Del' || key === 'Backspace') return
  11.  
  12. go.CommandHandler.prototype.doKeyDown.call(this)
  13. }

4. 画布滚动模式,无限滚动 or 局部滚动

问题:mac 上 触摸键能左滑右滑控制浏览器页面前进后退,很容易触发

方案:开启无限滚动,避免用户不小心触发了浏览器的前进后退

代码实现:

  1. function infiniteScroll = (infiniteScroll) {
  2. this.diagram.scrollMode = infiniteScroll ? go.Diagram.InfiniteScroll : go.Diagram.DocumentScroll
  3. }

5. 展开收起多层嵌套的组

问题:组多层嵌套,全部展开后,点击单个组收起第一次无效,第二次点击才生效

代码实现:

方式一:nodeArr 没有绑定 展开收起 属性

  1. // groupIds 为所有 group 的ids,从外到内。 一开始遍历组装数据的时候就收集好
  2. // groupIdsReverse 为所有 group 的ids,从内到外
  3. // 全部展开,从外到内
  4. // 全部收起,从内到外
  5. function setExpandCollapse (isExpand, groupIds, groupIdsReverse) {
  6. // 展开和折叠需要从两个方向处理,再次展开折叠交互才正常,否则第一次点无效,需要点第二次材有限
  7. let arr = isExpand ? groupIds : groupIdsReverse;
  8. let group;
  9.  
  10. arr.forEach(id => {
  11. group = diagram.findNodeForKey(id);
  12. group.isSubGraphExpanded = isExpand;
  13. })
  14. },

方式二:nodeArr 绑定 展开收起 属性 isExpanded

  1. function setExpandCollapse (isExpand) {
  2. const { nodeDataArray, linkDataArray } = diagram.model
  3. const newNodeArr = nodeDataArray.map(v => {
  4. if (v.isGroup) {
  5. return {...v, isExpanded: isExpand}
  6. }
  7. return v
  8. })
  9.  
  10. // 上面的方法
  11. updateData(newNodeArr, linkArr, false)
  12. }

6. 给图元素加动画

  • 虚线动画
  • icon loading 旋转动画

代码实现:

  1. function loop = () {
  2. const animationTimer = setTimeout(() => {
  3. clearTimeout(animationTimer)
  4. const oldskips = diagram.skipsUndoManager;
  5. diagram.skipsUndoManager = true;
  6.  
  7. // 虚线动画
  8. diagram.links.each((link: any) => {
  9. const dashedLinkShape = link.findObject("dashedLink");
  10. if (dashedLinkShape) {
  11. const off = dashedLinkShape.strokeDashOffset - 3;
  12. // 设置(移动)笔划划动画
  13. dashedLinkShape.strokeDashOffset = (off <= 0) ? 60 : off;
  14. }
  15. });
  16.  
  17. // loading 旋转
  18. diagram.nodes.each((node: any) => {
  19. const loadingShape = node.findObject("loading");
  20. if (loadingShape) {
  21. const angle = loadingShape.angle + 20;
  22. // 设置(移动)笔划划动画
  23. loadingShape.angle = (angle == 0) ? 360 : angle;
  24. }
  25. });
  26.  
  27. diagram.skipsUndoManager = oldskips;
  28. loop();
  29. }, 180);
  30. }
  31. loop()

7. 修改框选的样式

问题:框选样式:默认是红色的,和自定义的图颜色不匹配

  1. diagram.toolManager.dragSelectingTool.box = $(go.Part,
  2. { layerName: "Tool", selectable: false },
  3. $(go.Shape,
  4. { name: "SHAPE", fill: 'rgba(104, 129, 255, 0.2)', stroke: 'rgba(104, 129, 255, 0.5)', strokeWidth: 2 }));

以上所述是小编给大家介绍的gojs一些实用的高级用法,希望对大家有所帮助。在此也非常感谢大家对w3xue网站的支持!

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号