翻譯|使用教程|編輯:吳園園|2020-03-04 13:05:58.063|閱讀 1864 次
概述: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。
高層輸入事件
一些工具會檢測一系列輸入事件,以組成更為抽象的用戶事件。示例包括“點擊”(鼠標上下相互非??拷┖汀皯彝!保ㄒ欢螘r間不動鼠標)。這些工具將在鼠標指向當前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@ke049m.cn
文章轉載自: