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

SvelteKit中GoJS的diagram.model.toJson()无法更新问题求助

解决GoJS + SvelteKit中diagram.model.toJson()无法捕获现有节点/链接修改的问题

问题核心原因

你遇到的问题本质是修改节点/链接数据时没有遵循GoJS的模型更新规范:直接修改node.data或link.data的属性值,而没有通过GoJS Model提供的API进行修改。这种情况下,GoJS的模型不会追踪到数据变更,导致toJson()导出的仍是旧数据;但diagram.selection直接引用的是当前Part的内存对象,所以能看到最新值。

解决方案

所有对节点/链接数据的修改,必须通过Model.setDataProperty()方法执行,确保模型能捕获并记录变更:

// 错误示例:直接修改data属性,模型不会追踪
// node.data.name = "新名称";

// 正确示例:使用Model的API修改
diagram.model.setDataProperty(node.data, "name", "新名称");

补充验证点

  • 确认模型类型:确保你使用的是支持数据绑定的GoJS模型(如go.GraphLinksModel或go.TreeModel),而非基础的go.Model。
  • 监听器逻辑确认:你的modelChangedListener已经正确监听isTransactionFinished事件,这部分无需调整——新增节点/链接能触发保存,说明监听器工作正常。
  • 移除无效尝试:Diagram.rebuildParts()是用来重新渲染节点的,和模型数据同步无关,不需要调用;把saveDiagramToLocalStorage移到onMount内部也不影响模型数据的追踪。

完整修改示例(以修改节点名称为例)

// 在处理节点修改的逻辑中
const updateNodeName = (node, newName) => {
  // 必须通过Model API修改数据
  diagram.model.setDataProperty(node.data, "name", newName);
};

这样修改后,当你完成节点/链接的编辑操作,modelChangedListener触发时,diagram.model.toJson()就能导出包含最新修改的数据了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 21:33:18