提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|使用教程|编辑:杨鹏连|2020-12-02 10:58:55.837|阅读 243 次
概述:本指南将向您展示一些与GoJS节点,链接和模型数据进行编程交互的基本方法。在整个页面中,我们将以以下图表设置为起点。
# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>
相关链接:
GoJS是一款功能强大,快速且轻量级的流程图控件,可帮助你在JavaScript 和HTML5 Canvas程序中创建流程图,且极大地简化您的JavaScript / Canvas 程序。
与节点进行编程交互
本指南将向您展示一些与GoJS节点,链接和模型数据进行编程交互的基本方法。在整个页面中,我们将以以下图表设置为起点:
var $ = go.GraphObject.make; myDiagram = $(go.Diagram, "myDiagramDiv", { "undoManager.isEnabled": true }); // define a simple Node template myDiagram.nodeTemplate = $(go.Node, "Auto", $(go.Shape, "Rectangle", // don't draw any outline { stroke: null }, // the Shape.fill comes from the Node.data.color property new go.Binding("fill", "color")), $(go.TextBlock, // leave some space around larger-than-normal text { margin: 6, font: "18px sans-serif" }, // the TextBlock.text comes from the Node.data.key property new go.Binding("text", "key")) ); myDiagram.model = new go.GraphLinksModel( [ { key: "Alpha", color: "lightblue" }, { key: "Beta", color: "orange" }, { key: "Gamma", color: "lightgreen" }, { key: "Delta", color: "pink" } ]);代码产生此图:
查找单个节点:Diagram.findNodeForKey
您可以Diagram.findNodeForKey(key)用来获取对JavaScript中Node的引用。GoJS中的键值可以是字符串或数字。然后,您可以使用Node引用来检查和操作Node。
var node = myDiagram.findNodeForKey("Alpha"); // Selects the node programmatically, rather than clicking interactively: myDiagram.select(node); // Outputs a JavaScript object in the developer console window. // The format of what is output will differ per browser, but is essentially the object: // { key: "Alpha", color: "lightblue" } // plus some internal implementation details. console.log(node.data);但是,如果没有节点数据使用该键值,则findNodeForKey可能会返回null。同样,它仅查看模型数据以查找使用给定键值的节点数据,并从中找到图中的相应节点。它不查看节点内任何TextBlock的文本值,因此即使根本没有显示文本,它也可以工作。
一旦有了Node,就可以通过Node.key属性或通过查看其data:来获取其键someNode.data.key,就像可以查看任何数据属性一样。
节点和链接的集合
图具有一些属性和方法,这些属性和方法返回描述零件集合的迭代器。节点和链接都是零件。 Diagram.nodes并分别Diagram.links返回图中所有节点和链接的迭代器。 Diagram.selection返回选定零件(选定节点和选定链接)的迭代器。
还有一些用于通用操作的更具体的方法,例如,Diagram.findTreeRoots() 该方法返回没有父节点的所有顶级节点的迭代器。
下一个示例使用Diagram.nodes并显示如何遍历集合。
// Calling Diagram.commit executes the given function between startTransaction and commitTransaction // calls. That automatically updates the display and allows the effects to be undone. myDiagram.commit(function(d) { // this Diagram // iterate over all nodes in Diagram d.nodes.each(function(node) { if (node.data.key === "Beta") continue; //skip Beta, just to contrast node.scale = 0.4; // shrink each node }); }, "decrease scale");结果,除了Beta以外,我们的节点规模非常小:
命名为GraphObjects和Panel.findObject
通常,我们想要操纵一个属性,该属性属于Node的元素之一,也许是模板中任意深的元素。在示例图中,每个节点都有一个Shape,如果我们想直接更改Shape的颜色,则需要对其进行引用。为了找到它,我们可以给Shape命名:
myDiagram.nodeTemplate = $(go.Node, "Auto", $(go.Shape, "Rectangle", { stroke: null, name: "SHAPE" }, // added the name property new go.Binding("fill", "color")), $(go.TextBlock, { margin: 6, font: "18px sans-serif" }, new go.Binding("text", "key")) );名称使我们能够使用轻松地在Panel(所有节点也是Panel)内找到GraphObjects Panel.findObject,这将从该面板开始搜索Panel的可视树。因此,当我们有一个Node的引用时,我们可以调用someNode.findObject("SomeName") 来搜索该节点中的命名对象。如果找到,则它将返回对已命名GraphObject的引用null。
使用此按钮,我们可以创建一个HTML按钮,以更改选定节点内部Shape的填充:
var selectionButton = document.getElementById("selectionButton"); selectionButton.addEventListener("click", function() { myDiagram.commit(function(d) { d.selection.each(function(node) { var shape = node.findObject("SHAPE"); // If there was a GraphObject in the node named SHAPE, then set its fill to red: if (shape !== null) { shape.fill = "red"; } }); }, "change color"); });选择一些节点;然后单击此处更改选定节点内的Shape.fill
使用数据绑定更改属性和更新模型
再次查看我们的Node模板,我们将Shape.fill 属性数据绑定到Node数据的“ color”属性:
myDiagram.nodeTemplate = $(go.Node, "Auto", $(go.Shape, "Rectangle", { stroke: null, name: "SHAPE" }, new go.Binding("fill", "color")), // note this data binding $(go.TextBlock, { margin: 6, font: "18px sans-serif" }, new go.Binding("text", "key")) );更改fill节点内部的Shape属性不会像当前Node模板那样更新模型数据。
var node = myDiagram.findNodeForKey("Alpha"); var shape = node.findObject("SHAPE"); shape.fill = "red"; // outputs "lightblue" - the model has not changed! console.log(node.data.color);在某些情况下,这是不希望的。当我们希望更改在保存和加载后继续存在时,我们也希望更新模型数据。
但是,在某些情况下,缺乏持久性可能是一件好事。例如,如果我们只希望出于外观目的更改颜色,例如在将鼠标悬停在按钮上时更改按钮的颜色,则我们不希望修改可能保存的模型数据。
现在,假设我们确实要更新模型。执行此操作的首选方法是修改模型中的数据,并依靠数据绑定自动更新Shape。但是,我们不能仅通过设置JavaScript属性来直接修改数据。
var node = myDiagram.findNodeForKey("Alpha"); // DO NOT DO THIS! // This would update the data, but GoJS would not be notified // that this arbitrary JavaScript object has been modified, // and the associated Node will not be updated appropriately node.data.color = "red";相反,我们应该使用方法设置data属性 Model.set(data, propertyName, propertyValue)。
var node = myDiagram.findNodeForKey("Alpha"); // Model.commit executes the given function within a transaction myDiagram.model.commit(function(m) { // m == the Model // This is the safe way to change model data. // GoJS will be notified that the data has changed // so that it can update the node in the Diagram // and record the change in the UndoManager. m.set(node.data, "color", "red"); }, "change color"); // outputs "red" - the model has changed! console.log(node.data.color); // and the user will see the red node
请注意,不再需要将Shape命名为“ SHAPE”,因为不再需要调用findObject来查找特定的Shape。数据绑定将自动更新属性,因此我们不必自己做。
myDiagram.nodeTemplate = $(go.Node, "Auto", $(go.Shape, "Rectangle", { stroke: null }, // removed the name property new go.Binding("fill", "color")), $(go.TextBlock, { margin: 6, font: "18px sans-serif" }, new go.Binding("text", "key")) );
提及的主题和进一步阅读
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn
文章转载自:本文探讨 SQL Server 中 NULL 和空值之间的区别,并讨论如何有效地处理它们。
Unity 是一款功能极其丰富的游戏引擎,允许开发人员将各种媒体集成到他们的项目中。但是,它缺少最令人兴奋的功能之一 - 将 Web 内容(例如 HTML、CSS 和 JavaScript)直接渲染到 3D 场景中的纹理上的能力。在本文中,我们将介绍如何使用 DotNetBrowser 在 Unity3D 中将 Web 内容渲染为纹理。
DevExpress v24.2帮助文档正式发布上线了,请按版本按需下载~
本教程将向您展示如何用MyEclipse构建一个Web项目,欢迎下载最新版IDE体验!
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@pclwef.cn
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢