翻譯|使用教程|編輯:吳園園|2020-03-04 13:05:58.063|閱讀 1852 次
概述: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@fc6vip.cn
文章轉載自: