翻译|使用教程|编辑:吴园园|2020-03-04 13:05:58.063|阅读 1780 次
概述:GoJS处理 的事件有三种基本类型: DiagramEvent,InputEvent和ChangedEvent。该页面讨论了前两个。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
GoJS是一款功能强大,快速且轻量级的流程图控件,可帮助你在JavaScript 和HTML5 Canvas程序中创建流程图,且极大地简化您的JavaScript / Canvas 程序。
图表事件
DiagramEvent表示用户对图进行的常规更改。您可以通过调用Diagram.addDiagramListener来注册一个或多个图表事件处理程序。您还可以在调用GraphObject.make时在图初始化中注册图事件处理程序。每种图表事件均以其名称来区分。
当前定义的图事件名称包括:
除了DiagramEvent侦听器之外,在某些情况下,检测到此类更改很常见,足以保证具有作为事件处理程序的属性。因为这些事件不一定与任何特定的输入或图表事件相对应,所以这些事件处理程序具有特定于情况的自定义参数。
GraphObject.click 是一个非常常见的事件属性,如果非null,则它是一个在用户单击该对象时调用的函数。这最常用于指定“按钮”的行为,但是它以及其他“单击”事件属性“ doubleClick”和“ contextClick”在任何GraphObject上都可以使用。
另一个常见事件属性是Part.selectionChanged,只要Part.isSelected发生更改,就会调用该属性(如果为非null)。在这种情况下,事件处理函数将传递给单个参数Part。不需要其他参数,因为该函数可以检查Part.isSelected的当前值来确定要执行的操作。
与依赖DiagramEvent相比, Model ChangedEvent更加完整和可靠。例如,当代码向图中添加链接时,不会引发“ LinkDrawn” DiagramEvent。仅当用户使用LinkingTool绘制新链接时,才会引发DiagramEvent 。此外,链接尚未路由,因此将不会计算Link.points。实际上,创建新链接可能会使Layout无效,因此所有节点都可能在不久的将来被移动。
有时您想在用户更改图时更新数据库。通常你会想实现一个型号 ChangedEvent监听器,通过调用Model.addChangedListener或Diagram.addModelChangedListener,即注意到了更改模型,并决定如何在数据库中记录。
本示例演示如何处理几个图事件:“ ObjectSingleClicked”, “ BackgroundDoubleClicked”和“ ClipboardPasted”。
function showMessage(s) { document.getElementById("diagramEventsMsg").textContent = s; } diagram.addDiagramListener("ObjectSingleClicked", function(e) { var part = e.subject.part; if (!(part instanceof go.Link)) showMessage("Clicked on " + part.data.key); }); diagram.addDiagramListener("BackgroundDoubleClicked", function(e) { showMessage("Double-clicked at " + e.diagram.lastInput.documentPoint); }); diagram.addDiagramListener("ClipboardPasted", function(e) { showMessage("Pasted " + e.diagram.selection.count + " parts"); }); var nodeDataArray = [ { key: "Alpha" }, { key: "Beta", group: "Omega" }, { key: "Gamma", group: "Omega" }, { key: "Omega", isGroup: true }, { key: "Delta" } ]; var linkDataArray = [ { from: "Alpha", to: "Beta" }, // from outside the Group to inside it { from: "Beta", to: "Gamma" }, // this link is a member of the Group { from: "Omega", to: "Delta" } // from the Group to a Node ]; diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);
输入事件
当发生低级HTML DOM事件时,GoJS会将键盘/鼠标/触摸事件信息规范化为新的InputEvent,该InputEvent可以传递给各种事件处理方法并保存以供以后检查。
InputEvent保留InputEvent.key用于键盘事件,InputEvent.button用于鼠标事件,InputEvent.viewPoint用于鼠标和触摸事件,以及InputEvent.modifiers用于键盘和鼠标事件。
该图的事件处理程序也记录InputEvent.documentPoint,这是InputEvent.viewPoint在鼠标事件发生时在文件坐标,InputEvent.timestamp,记录了事件发生的时间(毫秒)。
InputEvent类还为特定类型的事件提供了许多方便的属性。示例包括InputEvent.control(如果已按下控制键)和InputEvent.left(如果已按下 鼠标左/主按钮)。
一些工具在鼠标指针处找到“当前” GraphObject。这被记住为InputEvent.targetObject。
高层输入事件
一些工具会检测一系列输入事件,以组成更为抽象的用户事件。示例包括“点击”(鼠标上下相互非常靠近)和“悬停”(一段时间不动鼠标)。这些工具将在鼠标指向当前GraphObject的事件处理程序(如果有的话)。事件处理程序被保留为对象上属性的值。然后,它还会在GraphObject.panel的链上“冒泡”事件,直到事件以Part结尾。这允许在面板上声明“单击”事件处理程序,并使该处理程序应用,即使单击实际上发生在面板深处的元素上也是如此。如果鼠标指针上没有任何对象,则该事件将在图中发生。
类似于单击的事件属性包括GraphObject.click,GraphObject.doubleClick和GraphObject.contextClick。当没有GraphObject时,它们也会发生-事件发生在图的背景中: Diagram.click,Diagram.doubleClick和Diagram.contextClick。这些都是可以设置为事件处理程序的函数的属性。这些事件是由鼠标事件和触摸事件引起的。
类似鼠标悬停的事件属性包括GraphObject.mouseEnter,GraphObject.mouseOver和GraphObject.mouseLeave。但是只有Diagram.mouseOver适用于该图。
类似悬停的事件属性包括GraphObject.mouseHover和GraphObject.mouseHold。等效的图属性是Diagram.mouseHover和Diagram.mouseHold。
还有一些用于拖动操作的事件属性:GraphObject.mouseDragEnter,GraphObject.mouseDragLeave和GraphObject.mouseDrop。这些适用于固定对象,而不适用于被拖动的对象。而且,它们在通过触摸事件(而不仅仅是鼠标事件)拖动时也会发生。
此示例演示如何处理三个更高级别的输入事件:单击节点并输入/离开组。
function showMessage(s) { document.getElementById("inputEventsMsg").textContent = s; } diagram.nodeTemplate = $(go.Node, "Auto", $(go.Shape, "Ellipse", { fill: "white" }), $(go.TextBlock, new go.Binding("text", "key")), { click: function(e, obj) { showMessage("Clicked on " + obj.part.data.key); } } ); diagram.groupTemplate = $(go.Group, "Vertical", $(go.TextBlock, { alignment: go.Spot.Left, font: "Bold 12pt Sans-Serif" }, new go.Binding("text", "key")), $(go.Panel, "Auto", $(go.Shape, "RoundedRectangle", { name: "SHAPE", parameter1: 14, fill: "rgba(128,128,128,0.33)" }), $(go.Placeholder, { padding: 5 }) ), { mouseEnter: function(e, obj, prev) { // change group's background brush var shape = obj.part.findObject("SHAPE"); if (shape) shape.fill = "red"; }, mouseLeave: function(e, obj, next) { // restore to original brush var shape = obj.part.findObject("SHAPE"); if (shape) shape.fill = "rgba(128,128,128,0.33)"; } }); var nodeDataArray = [ { key: "Alpha" }, { key: "Beta", group: "Omega" }, { key: "Gamma", group: "Omega" }, { key: "Omega", isGroup: true }, { key: "Delta" } ]; var linkDataArray = [ { from: "Alpha", to: "Beta" }, // from outside the Group to inside it { from: "Beta", to: "Gamma" }, // this link is a member of the Group { from: "Omega", to: "Delta" } // from the Group to a Node ]; diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);
单击并选择
此示例演示了“ click”事件和“ selectionChanged”事件:
尝试按Ctrl-A选择所有内容。请注意GraphObject.click事件属性和Part.selectionChanged事件属性之间的区别。两者都是在节点发生问题时调用的方法。所述GraphObject.click当用户点击的节点,这恰好选择的节点上发生。但是,即使没有单击事件或任何鼠标事件,也会发生Part.selectionChanged,这是由于节点的属性更改所致。
想要购买GoJS正版授权的朋友可以
function showMessage(s) {
document.getElementById("changeMethodsMsg").textContent = s;
}
diagram.nodeTemplate =
$(go.Node, "Auto",
{ selectionAdorned: false },
$(go.Shape, "Ellipse", { fill: "white" }),
$(go.TextBlock,
new go.Binding("text", "key")),
{
click: function(e, obj) { showMessage("Clicked on " + obj.part.data.key); },
selectionChanged: function(part) {
var shape = part.elt(0);
shape.fill = part.isSelected ? "red" : "white";
}
}
);
var nodeDataArray = [
{ key: "Alpha" }, { key: "Beta" }, { key: "Gamma" }
];
var linkDataArray = [
{ from: "Alpha", to: "Beta" },
{ from: "Beta", to: "Gamma" }
];
diagram.model = new go.GraphLinksModel(nodeDataArray, linkDataArray);
温馨提示:疫情期间返岗上班需戴口罩、勤洗手、常通风,做好防护措施!
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自: