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
相关产品推荐
相关产品推荐

