翻譯|使用教程|編輯:吳園園|2020-03-04 13:05:58.063|閱讀 1852 次
概述:GoJS處理 的事件有三種基本類(lèi)型: DiagramEvent,InputEvent和ChangedEvent。該頁(yè)面討論了前兩個(gè)。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷(xiāo)售中 >>
相關(guān)鏈接:
GoJS是一款功能強(qiáng)大,快速且輕量級(jí)的流程圖控件,可幫助你在JavaScript 和HTML5 Canvas程序中創(chuàng)建流程圖,且極大地簡(jiǎn)化您的JavaScript / Canvas 程序。
圖表事件
DiagramEvent表示用戶(hù)對(duì)圖進(jìn)行的常規(guī)更改。您可以通過(guò)調(diào)用Diagram.addDiagramListener來(lái)注冊(cè)一個(gè)或多個(gè)圖表事件處理程序。您還可以在調(diào)用GraphObject.make時(shí)在圖初始化中注冊(cè)圖事件處理程序。每種圖表事件均以其名稱(chēng)來(lái)區(qū)分。
當(dāng)前定義的圖事件名稱(chēng)包括:
除了DiagramEvent偵聽(tīng)器之外,在某些情況下,檢測(cè)到此類(lèi)更改很常見(jiàn),足以保證具有作為事件處理程序的屬性。因?yàn)檫@些事件不一定與任何特定的輸入或圖表事件相對(duì)應(yīng),所以這些事件處理程序具有特定于情況的自定義參數(shù)。
GraphObject.click 是一個(gè)非常常見(jiàn)的事件屬性,如果非null,則它是一個(gè)在用戶(hù)單擊該對(duì)象時(shí)調(diào)用的函數(shù)。這最常用于指定“按鈕”的行為,但是它以及其他“單擊”事件屬性“ doubleClick”和“ contextClick”在任何GraphObject上都可以使用。
另一個(gè)常見(jiàn)事件屬性是Part.selectionChanged,只要Part.isSelected發(fā)生更改,就會(huì)調(diào)用該屬性(如果為非null)。在這種情況下,事件處理函數(shù)將傳遞給單個(gè)參數(shù)Part。不需要其他參數(shù),因?yàn)樵摵瘮?shù)可以檢查Part.isSelected的當(dāng)前值來(lái)確定要執(zhí)行的操作。
與依賴(lài)DiagramEvent相比, Model ChangedEvent更加完整和可靠。例如,當(dāng)代碼向圖中添加鏈接時(shí),不會(huì)引發(fā)“ LinkDrawn” DiagramEvent。僅當(dāng)用戶(hù)使用LinkingTool繪制新鏈接時(shí),才會(huì)引發(fā)DiagramEvent 。此外,鏈接尚未路由,因此將不會(huì)計(jì)算Link.points。實(shí)際上,創(chuàng)建新鏈接可能會(huì)使Layout無(wú)效,因此所有節(jié)點(diǎn)都可能在不久的將來(lái)被移動(dòng)。
有時(shí)您想在用戶(hù)更改圖時(shí)更新數(shù)據(jù)庫(kù)。通常你會(huì)想實(shí)現(xiàn)一個(gè)型號(hào) ChangedEvent監(jiān)聽(tīng)器,通過(guò)調(diào)用Model.addChangedListener或Diagram.addModelChangedListener,即注意到了更改模型,并決定如何在數(shù)據(jù)庫(kù)中記錄。
本示例演示如何處理幾個(gè)圖事件:“ 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);
輸入事件
當(dāng)發(fā)生低級(jí)HTML DOM事件時(shí),GoJS會(huì)將鍵盤(pán)/鼠標(biāo)/觸摸事件信息規(guī)范化為新的InputEvent,該InputEvent可以傳遞給各種事件處理方法并保存以供以后檢查。
InputEvent保留InputEvent.key用于鍵盤(pán)事件,InputEvent.button用于鼠標(biāo)事件,InputEvent.viewPoint用于鼠標(biāo)和觸摸事件,以及InputEvent.modifiers用于鍵盤(pán)和鼠標(biāo)事件。
該圖的事件處理程序也記錄InputEvent.documentPoint,這是InputEvent.viewPoint在鼠標(biāo)事件發(fā)生時(shí)在文件坐標(biāo),InputEvent.timestamp,記錄了事件發(fā)生的時(shí)間(毫秒)。
InputEvent類(lèi)還為特定類(lèi)型的事件提供了許多方便的屬性。示例包括InputEvent.control(如果已按下控制鍵)和InputEvent.left(如果已按下 鼠標(biāo)左/主按鈕)。
一些工具在鼠標(biāo)指針處找到“當(dāng)前” GraphObject。這被記住為InputEvent.targetObject。
高層輸入事件
一些工具會(huì)檢測(cè)一系列輸入事件,以組成更為抽象的用戶(hù)事件。示例包括“點(diǎn)擊”(鼠標(biāo)上下相互非??拷┖汀皯彝!保ㄒ欢螘r(shí)間不動(dòng)鼠標(biāo))。這些工具將在鼠標(biāo)指向當(dāng)前GraphObject的事件處理程序(如果有的話(huà))。事件處理程序被保留為對(duì)象上屬性的值。然后,它還會(huì)在GraphObject.panel的鏈上“冒泡”事件,直到事件以Part結(jié)尾。這允許在面板上聲明“單擊”事件處理程序,并使該處理程序應(yīng)用,即使單擊實(shí)際上發(fā)生在面板深處的元素上也是如此。如果鼠標(biāo)指針上沒(méi)有任何對(duì)象,則該事件將在圖中發(fā)生。
類(lèi)似于單擊的事件屬性包括GraphObject.click,GraphObject.doubleClick和GraphObject.contextClick。當(dāng)沒(méi)有GraphObject時(shí),它們也會(huì)發(fā)生-事件發(fā)生在圖的背景中: Diagram.click,Diagram.doubleClick和Diagram.contextClick。這些都是可以設(shè)置為事件處理程序的函數(shù)的屬性。這些事件是由鼠標(biāo)事件和觸摸事件引起的。
類(lèi)似鼠標(biāo)懸停的事件屬性包括GraphObject.mouseEnter,GraphObject.mouseOver和GraphObject.mouseLeave。但是只有Diagram.mouseOver適用于該圖。
類(lèi)似懸停的事件屬性包括GraphObject.mouseHover和GraphObject.mouseHold。等效的圖屬性是Diagram.mouseHover和Diagram.mouseHold。
還有一些用于拖動(dòng)操作的事件屬性:GraphObject.mouseDragEnter,GraphObject.mouseDragLeave和GraphObject.mouseDrop。這些適用于固定對(duì)象,而不適用于被拖動(dòng)的對(duì)象。而且,它們?cè)谕ㄟ^(guò)觸摸事件(而不僅僅是鼠標(biāo)事件)拖動(dòng)時(shí)也會(huì)發(fā)生。
此示例演示如何處理三個(gè)更高級(jí)別的輸入事件:?jiǎn)螕艄?jié)點(diǎn)并輸入/離開(kāi)組。
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選擇所有內(nèi)容。請(qǐng)注意GraphObject.click事件屬性和Part.selectionChanged事件屬性之間的區(qū)別。兩者都是在節(jié)點(diǎn)發(fā)生問(wèn)題時(shí)調(diào)用的方法。所述GraphObject.click當(dāng)用戶(hù)點(diǎn)擊的節(jié)點(diǎn),這恰好選擇的節(jié)點(diǎn)上發(fā)生。但是,即使沒(méi)有單擊事件或任何鼠標(biāo)事件,也會(huì)發(fā)生Part.selectionChanged,這是由于節(jié)點(diǎn)的屬性更改所致。
想要購(gòu)買(mǎi)GoJS正版授權(quán)的朋友可以
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);
溫馨提示:疫情期間返崗上班需戴口罩、勤洗手、常通風(fēng),做好防護(hù)措施!
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自: