You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GoJS中Group侧边创建Port时arr变量未定义问题求助

解决GoJS Group侧边添加Port时arr为undefined的问题

我帮你定位到了问题的核心:当你从Palette拖出新的Group并尝试添加Port时,你的Group数据对象里没有预先初始化leftArray和rightArray这些用于存储Port数据的数组字段,所以执行到var arr = node.data[side + "Array"];这一行时,arr自然是undefined,导致后续无法插入新的Port数据。

具体修复方案

你可以通过以下两步彻底解决这个问题:

1. 给Palette中的Group数据初始化数组字段

修改Palette的Model数据,为Group添加leftArray和rightArray(如果需要上下侧Port,也可以同步添加topArray、bottomArray):

myPalette.model = new go.GraphLinksModel([
  { 
    key: 101, 
    text: 'UNIT', 
    isGroup: true, 
    isSubProcess: true, 
    category: "OfGroups", 
    isAdHoc: true, 
    loc: '0 0',
    leftArray: [],  // 初始化左侧Port存储数组
    rightArray: []  // 初始化右侧Port存储数组
  },
]);

2. 在addPort函数中添加兜底处理(可选但更健壮)

为了避免其他场景下Group数据未初始化数组的情况,在addPort函数中增加判断:如果数组不存在,就创建空数组并同步到Model中:

function addPort(side) {
  myDiagram.startTransaction("addPort");
  myDiagram.selection.each(function(node) {
    if (!(node instanceof go.Node)) return;

    var i = 0;
    while (node.findPort(side + i.toString()) !== node) i++;
    var name = side + i.toString();

    var arr = node.data[side + "Array"];
    // 兜底:如果数组不存在,创建空数组并更新Model数据
    if (!arr) {
      arr = [];
      myDiagram.model.setDataProperty(node.data, side + "Array", arr);
    }

    var newportdata = {
      portId: name,
      portColor: go.Brush.randomColor()
    };
    myDiagram.model.insertArrayItem(arr, -1, newportdata);
  });
  myDiagram.commitTransaction("addPort");
}

额外验证

确认你的Group模板中,左右侧Port的Panel已经正确绑定了itemArray(你的代码里这部分是正确的,这里再核对下):

// 左侧Port容器Panel
$(go.Panel, "Vertical",
  new go.Binding("itemArray", "leftArray"),  // 绑定对应的数据数组
  { /* 其他配置 */ }
),
// 右侧Port容器Panel
$(go.Panel, "Vertical",
  new go.Binding("itemArray", "rightArray"),  // 绑定对应的数据数组
  { /* 其他配置 */ }
)

完成以上修改后,右键Group选择添加左侧/右侧Port时,就能正常创建并显示Port了。

内容的提问来源于stack exchange,提问作者user1438509

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:42:43