GoJS涵盖了三种基本事件:DiagramEvents(图表事件)、InputEvents(输入事件)以及ChangedEvents(变更事件)。这一页我们讨论前两种事件;至于最后一种事件请见 Changed Events

1、图表事件(Diagram Events)

DiagramEvent(图表事件)表示一般用户发起的对图表的改变。你可以通过调用Diagram.addDiagramListener注册图表事件处理程序。各个图表事件以名字区分。

目前定义了的图表事件名称包括:

更多详细内容,请见文档DiagramEvent

图表事件并不一定与鼠标/键盘或者触摸事件相对应。它们也不一定与图表模型的变化相对应——要跟踪这些变化,使用Model.addChangedListener或者Diagram.addModelChangedListener。当用户做了什么或者间接做了什么时,图表事件才会产生。

除了图表事件监听器之外,还有一些情况是,当发现一些变动足以表明一些属性是事件处理程序。由于这些事件并不一定需要与任何特殊的输入或者图表事件对应,座椅这些事件处理程序就会有特定于情况的自定义参数。

一个非常常见的事件属性是GraphObject.click,它指的是无论何时用户点击一个对象时调用的一个非空的函数。它最常用于为按钮指定行为,但是它与其他的点击事件属性,双击和右键点击,对于任何GraphObject都是有用的。

另外一个常见的事件属性是Part.selectionChanged,它指的是当Part.isSelected改变时调用的一个非空函数。在下面的示例中,事件处理函数有一个参数,该Part。由于函数能够检查Part.isSelected的当前值从而决定要做什么,所以不需要其余的参数。

模型的ChangedEvent事件比基于DiagramEvent更完成可靠。例如,当在代码里为图表增加一条连接线时,"LinkDrawn" 图表事件不会被调用。图表事件只有在用户用 LinkingTool 添加一条新的连接线时才被调用。另外,连接线没有被改变路线,因此Link.points不会被计算。事实上,创建一条新的连接线可能会使一个Layout失效,因此,所有的节点都可能会在不久后被移动。

有时候用户对图标做了一些改动,你需要更新数据库。 通常,你会想要执行一个Model ChangedEvent监听器, 通过调用Model.addChangedListener或者Diagram.addModelChangedListener, 然后把这些改变通知给模型层,再决定把哪些记录到数据库里。请查看关于Changed EventsUpdate Demo的讨论.

这个示例展示了几个图表事件:"ObjectSingleClicked"(单机对象),"BackgroundDoubleClicked"(双击背景), 和"ClipboardPasted"(剪贴板复制)。

例子:

  1.  
    function showMessage(s) {
  2.  
    document.getElementById("diagramEventsMsg").textContent = s;
  3.  
    }
  4.  
     
  5.  
    // 为diagram添加一个“对象单机”事件
  6.  
    diagram.addDiagramListener("ObjectSingleClicked",
  7.  
    function(e) {
  8.  
    var part = e.subject.part;
  9.  
    //如果鼠标单机的不是连接线,则显示信息:"Clicked on" + 鼠标点击的目标的key值
  10.  
    if (!(part instanceof go.Link)) showMessage("Clicked on " + part.data.key);
  11.  
    }
  12.  
    );
  13.  
     
  14.  
    //为diagram添加“背景双击”事件
  15.  
    diagram.addDiagramListener("BackgroundDoubleClicked",
  16.  
    function(e) {
  17.  
    //显示信息: “Double-clicked at” + 点击的点的坐标值
  18.  
    showMessage("Double-clicked at " + e.diagram.lastInput.documentPoint);
  19.  
    }
  20.  
    );
  21.  
     
  22.  
    //为diagram添加“剪贴板复制粘贴”事件
  23.  
    diagram.addDiagramListener("ClipboardPasted",
  24.  
    function(e) {
  25.  
    //复制某个节点Part后,粘贴时,显示信息:“Pasted” + 复制粘贴的节点数量
  26.  
    showMessage("Pasted " + e.diagram.selection.count + " parts");
  27.  
    }
  28.  
    );
  29.  
     
  30.  
    var nodeDataArray = [
  31.  
    { key: "Alpha" },
  32.  
    { key: "Beta", group: "Omega" },
  33.  
    { key: "Gamma", group: "Omega" },
  34.  
    { key: "Omega", isGroup: true },
  35.  
    { key: "Delta" }
  36.  
    ];
  37.  
    var linkDataArray = [
  38.  
    { from: "Alpha", to: "Beta" }, // 从Group外指向Group内
  39.  
    { from: "Beta", to: "Gamma" }, // 这条连接线是Group内部的
  40.  
    { from: "Omega", to: "Delta" } // 从Group指向一个节点
  41.  
    ];
  42.  
    diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);

2、输入事件

当发生低级HTML DOM事件时,GoJS会将键盘/鼠标/触摸事件信息规范化转换为一个能够被传递给各种事件处理方法且为后面的检查而保存的新的 InputEvent(输入事件)。

一个输入事件,用InputEvent.key存放键盘事件, 用InputEvent.button存放鼠标事件, 用InputEvent.viewPoint存放鼠标和触摸事件, 用InputEvent.modifiers存放键盘和鼠标事件。

图表的事件处理程序同时也记录InputEvent.documentPoint,也就是鼠标事件发生时的文档坐标 InputEvent.viewPoint ,以及事件发生时的以毫秒为单位的时间戳 InputEvent.timestamp

输入事件类还未特定类型的事件提供了很多很便利的属性。比如,InputEvent.control (如果按下控制键)和InputEvent.left (如果按下左/主鼠标按钮)。

一些工具在鼠标点击的点可以找到当前的GraphObject(图形对象)。这些图形对象就被记为InputEvent.targetObject

3、高级输入事件

一些工具能检测一系列的输入事件以组成一些更抽象的用户事件。比如说,“点击”(鼠标迅速的按下并放开)和“悬停”(鼠标静止不动一段时间)。这些工具会为当前鼠标所在的点对应的GrapgObject调用一个事件处理程序(如果有的话)。这个事件处理程序被当做对象的一个属性值。它还会沿着 GraphObject.panel的链向上冒泡知道这个Part结束。这允许了一个“点击”事件在一个Panel上被申明并应用,即使实际的点击是发生在Panel内部的元素上的。如果鼠标所在的点没有对象,那时间就会发生在最外层的图表上。

类似的点击事件属性包括 GraphObject.clickGraphObject.doubleClick, 和 GraphObject.contextClick。即便没有GraphObject时,这些事件也会发生——事件会发生在图表的背景上发生:Diagram.clickDiagram.doubleClick, 和 Diagram.contextClick。这些都是你可以设置为事件处理程序的函数。这些事件是由鼠标事件和触摸事件引起的。

类似的鼠标移入事件属性包括GraphObject.mouseEnterGraphObject.mouseOverGraphObject.mouseLeave。但是只有Diagram.mouseOver会被应用到图表上。

类似的鼠标悬停事件属性包括 GraphObject.mouseHoverGraphObject.mouseHold。等价的图表属性是Diagram.mouseHoverDiagram.mouseHold.

拖拽操作也有对应的事件属性:GraphObject.mouseDragEnterGraphObject.mouseDragLeave, 和GraphObject.mouseDrop. 他们适用于静止的对象,而不是被拖动中的对象。同时,他们也适用于触摸事件的拖拽,而不仅仅是鼠标事件的拖拽。

下面的示例展示了三个高级输入事件:点击节点、进入/离开group(组)。

  1.  
    function showMessage(s) {
  2.  
    document.getElementById("inputEventsMsg").textContent = s;
  3.  
    }
  4.  
     
  5.  
    diagram.nodeTemplate =
  6.  
    $(go.Node, "Auto",
  7.  
    $(go.Shape, "Ellipse", { fill: "white" }),
  8.  
    $(go.TextBlock,
  9.  
    new go.Binding("text", "key")),
  10.  
    { click: function(e, obj) { showMessage("Clicked on " + obj.part.data.key); } }
  11.  
    );
  12.  
     
  13.  
    diagram.groupTemplate =
  14.  
    $(go.Group, "Vertical",
  15.  
    $(go.TextBlock,
  16.  
    { alignment: go.Spot.Left, font: "Bold 12pt Sans-Serif" },
  17.  
    new go.Binding("text", "key")),
  18.  
    $(go.Panel, "Auto",
  19.  
    $(go.Shape, "RoundedRectangle",
  20.  
    { name: "SHAPE",
  21.  
    parameter1: 14,
  22.  
    fill: "rgba(128,128,128,0.33)" }),
  23.  
    $(go.Placeholder, { padding: 5 })
  24.  
    ),
  25.  
    { mouseEnter: function(e, obj, prev) { // 改变group的背景画笔
  26.  
    var shape = obj.part.findObject("SHAPE");
  27.  
    if (shape) shape.fill = "red";
  28.  
    },
  29.  
    mouseLeave: function(e, obj, next) { // 回复原始的画笔
  30.  
    var shape = obj.part.findObject("SHAPE");
  31.  
    if (shape) shape.fill = "rgba(128,128,128,0.33)";
  32.  
    } });
  33.  
     
  34.  
    var nodeDataArray = [
  35.  
    { key: "Alpha" },
  36.  
    { key: "Beta", group: "Omega" },
  37.  
    { key: "Gamma", group: "Omega" },
  38.  
    { key: "Omega", isGroup: true },
  39.  
    { key: "Delta" }
  40.  
    ];
  41.  
     
  42.  
    var linkDataArray = [
  43.  
    { from: "Alpha", to: "Beta" }, // 从Group外指向Group内
  44.  
    { from: "Beta", to: "Gamma" }, // 这条连接线是Group内部的
  45.  
    { from: "Omega", to: "Delta" } // 从Group指向一个节点
  46.  
    ];
  47.  
    diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);

3、点击与选中

这个示例同时展示了“点击”和“selectionChanged”事件:

  1.  
    function showMessage(s) {
  2.  
    document.getElementById("changeMethodsMsg").textContent = s;
  3.  
    }
  4.  
     
  5.  
    diagram.nodeTemplate =
  6.  
    $(go.Node, "Auto",
  7.  
    { selectionAdorned: false },
  8.  
    $(go.Shape, "Ellipse", { fill: "white" }),
  9.  
    $(go.TextBlock,
  10.  
    new go.Binding("text", "key")),
  11.  
    {
  12.  
    click: function(e, obj) { showMessage("Clicked on " + obj.part.data.key); },
  13.  
    selectionChanged: function(part) {
  14.  
    var shape = part.elt(0);
  15.  
    shape.fill = part.isSelected ? "red" : "white";
  16.  
    }
  17.  
    }
  18.  
    );
  19.  
    var nodeDataArray = [
  20.  
    { key: "Alpha" }, { key: "Beta" }, { key: "Gamma" }
  21.  
    ];
  22.  
     
  23.  
    var linkDataArray = [
  24.  
    { from: "Alpha", to: "Beta" },
  25.  
    { from: "Beta", to: "Gamma" }
  26.  
    ];
  27.  
    diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);

试着按下“Ctrl-A”可以全选所有的对象。注意 GraphObject.click事件属性与Part.selectionChanged事件属性的区别。当节点上发生什么事情时,两个方法都能被调用。GraphObject.click事件会在用户点击节点时发生,选中了节点。但是Part.selectionChanged事件在没有点击事件(或者任何鼠标事件)时就会发生——这是由于节点的一个属性值变了

gojs Diagram Events(图表事件)的更多相关文章

  1. Lind.DDD.Events领域事件介绍

    回到目录 闲话多说 领域事件大叔感觉是最不好讲的一篇文章,所以拖欠了很久,但最终还是在2015年年前(阴历)把这个知识点讲一下,事件这个东西早在C#1.0时代就有了,那时学起来也是一个费劲,什么是委托 ...

  2. jQuery Direct and delegated events 直接事件与委托事件

    ref: http://api.jquery.com/on/ 直接事件: 将事件委托直接绑定到dom元素上,当事件发生时触发handler. 委托事件:  将事件委托绑定到dom元素的外层容器上,当事 ...

  3. Sentry(v20.12.1) K8S 云原生架构探索,JavaScript Enriching Events(丰富事件信息)

    系列 Sentry-Go SDK 中文实践指南 一起来刷 Sentry For Go 官方文档之 Enriching Events Snuba:Sentry 新的搜索基础设施(基于 ClickHous ...

  4. Backbone☞View中的events...click事件失效

    <div id="container"> <input type="button" id="test_click" val ...

  5. 安卓 Input Events(输入事件)

    在安卓中,有不止一种方法从你的应用截取用户交互事件.在你的用户界面中考虑事件,途径就是从用户界面中的一个指定的view对象中捕获事件.该view提供了这样做的方法. 在你用来组成你布局的不同的view ...

  6. GoJS 教程新手入门(资源整理,解决方案)

    以下几个是我在百度.谷歌 上能找到的比较全的GoJs的一些东西,希望对各位有所帮助! 如有外网网站不能访问请自行FQ GoJS官网 第一个推荐的是GoJS的一个类似于社区的问题讨论区,这里面初学者的一 ...

  7. GoJS 友情链接

    目前GoJS官网是学习gojs的最佳选择 GOJS简单示例 GoJS API学习 GoJS组织结构图2 mind map思维导图 组织结构图 GoJS实例1 GoJS实例2 GoJS实例3 GoJS实 ...

  8. Highcharts.js -纯javasctipt图表库初体验

    一.highcharts简介以及引入 highcharts作为免费提供给个人学习.个人网站和非商业用途使用的前端图表演示插件的确使用起来十分方便和轻便.在我最近完成一个需求的时候用到了它, 它的兼容性 ...

  9. 可视化图表库--goJS

    GoJS是Northwoods Software的产品.Northwoods Software创立于1995年,专注于交互图控件和类库.旗下四款产品: GoJS:用于在HTML上创建交互图的纯java ...

随机推荐

  1. 已经安装了VRay但3dmax的材质编辑器里没有VRay材质的解决过程

    已经安装了VRay但3dmax的材质编辑器里没有VRay材质怎么办? 众所周知,vray是一款很好用的渲染器,但是安装过程和使用当中总会出现各种问题.昨天我就遇到了,捣鼓半天终于解决,分享给大家自己的 ...

  2. 【VS开发】【数据库开发】libevent简单入门和介绍

    libevent是一个基于事件触发的网络库,memcached底层也是使用libevent库,今天学习下. 总体来说,libevent有下面一些特点和优势: * 统一数据源, 统一I/O事件,信号和定 ...

  3. Spring 使用日期类型

    1. 数据层数据类型依赖包  java.time.LocalDate 2.pom.xml添加依赖 <dependency> <groupId>org.thymeleaf.ext ...

  4. yml 文件中使用环境变量

    Spring Boot 中可以用 spring.profiles.active 参数来指定系统环境,让系统加载不同的配置文件. 可以在程序启动的时候加上参数来指定需要的配置 java -Dspring ...

  5. [转载]Oracle触发器详解

    转载自http://blog.csdn.net/indexman/article/details/8023740/ 触发器是许多关系数据库系统都提供的一项技术.在oracle系统里,触发器类似过程和函 ...

  6. 采用霍夫曼编码(Huffman)画出字符串各字符编码的过程并求出各字符编码 --多媒体技术与应用

    题目:有一个字符串:cabcedeacacdeddaaaba,问题: (1)采用霍夫曼编码画出编码的过程,并写出各字符的编码 (2)根据求得的编码,求得各编码需要的总位数 (3)求出整个字符串总编码长 ...

  7. error PRJ0003 : 生成“rc.exe”时出错

    完美解决 visual studio 2008运行时 error PRJ0003 : 生成“rc.exe”时出错 步骤如下 : 1.运行vs2008安装程序,点击安装或删除程序.在“选择要安装的功能” ...

  8. LIUNX随堂学习-1 用户及查看信息

    1.useradd   #创建用户             例如:useradd ljj     创建一个名为ljj的用户 2.userdel -r    #删除用户         例如:userd ...

  9. 20190621-N皇后

    N皇后 难度分类 困难 题目描述 n皇后问题研究的是如何将 n个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击. 上图为 8 皇后问题的一种解法. 给定一个整数 n,返回所有不同的 n  ...

  10. Scratch运动模块——有趣的弹球游戏(一)

    大家好!我是蓝老师,有了前几期Scratch的基础,相信大家早已摩拳擦掌,跃跃欲试了,甚至还有些小伙伴已经编写了非常不错的程序. 学习编程就是这样不断探索.主动思考.解决问题的过程. 本期内容: 课程 ...