扩展Dynamic Ports示例,我在leftArray中创建了一个带有几个端口的节点。每个端口均由如下模型定义:

{id: "port1"}


在端口的上下文菜单中,我让用户重命名它。当前,出于测试目的,右键单击端口会打开一个上下文菜单,其中包含一个按钮:“重命名”。单击“重命名”会将模型的id字段更改为“ foo”:

function(e, obj) {
   obj.part.data.id = "foo";
}


id字段使用以下方式绑定到portId属性:

new go.Binding("portId", "id").makeTwoWay()


现在,当我创建从另一个节点到此重命名端口的链接,并使用myDiagram.model.toJson()观看我的图表的模型时,我看到该链接似乎已连接到相应的端口,但使用的是旧的portId

我在这里想念什么?

谢谢

最佳答案

是的,您没有修改对端口的链接数据引用,因此链接继续被路由到相同的端口GraphObjects。但是,如果加载了保存的模型,您会发现链接现在似乎已连接到其他对象,具体取决于当前使用的端口标识符。

建议您在修改端口ID之后,在连接的链接上进行迭代并更新端口引用。类似于“动态端口”示例中的此额外上下文菜单按钮:

makeButton("Rename port", function(e, obj) { var port = obj.part.adornedObject; var node = port.part; var data = port.data; var oldpid = data.portId; var linksinto = new go.List().addAll(node.findLinksInto(oldpid)); var linksoutof = new go.List().addAll(node.findLinksOutOf(oldpid)); myDiagram.startTransaction("portId"); // find a new unique port identifier var newpid = Math.floor(Math.random() * 1000000).toString(); while (node.findPort(newpid) !== node.port) { newpid = Math.floor(Math.random() * 1000000).toString(); } // change port identifier myDiagram.model.setDataProperty(data, "portId", newpid); // change connected link references to ports linksinto.each(function(l) { myDiagram.model.setToPortIdForLinkData(l.data, newpid); }); linksoutof.each(function(l) { myDiagram.model.setFromPortIdForLinkData(l.data, newpid); }); myDiagram.commitTransaction("portId"); }),

关于javascript - 创建后更改go.js portId,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43962895/

10-13 09:50