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

如何在JointJS中实现工作区保存功能?已集成KitchenSink示例

嗨,作为JointJS新手能想到扩展保存功能真的很棒!完全可以实现保存工作区的需求,JointJS本身就提供了完善的图形序列化API,下面我给你详细讲具体的实现方法:

核心思路

JointJS的Graph对象内置了toJSON()方法,可以把整个工作区的所有内容(包括节点、连线、位置、样式、甚至自定义属性)完整序列化成JSON格式。保存这个JSON数据,之后通过fromJSON()方法就能一键恢复整个工作区的状态。

具体实现步骤

1. 给Kitchensink界面添加保存按钮

首先在示例的工具栏区域加个保存按钮,比如:

<button id="save-workspace" style="margin-left: 10px;">保存工作区</button>

如果示例用的是自定义工具栏组件,也可以对应添加一个菜单项或者按钮元素。

2. 实现保存逻辑

根据你的需求,可以选择保存到本地浏览器存储(快速测试)或者后端服务器(持久化存储):

方案一:保存到本地localStorage(适合快速验证)

// 先获取Kitchensink里的Graph实例,示例里一般是全局或模块内的`graph`变量
const graph = joint.dia.graph;

// 绑定保存按钮的点击事件
document.getElementById('save-workspace').addEventListener('click', () => {
  // 将图形序列化为JSON对象
  const workspaceData = graph.toJSON();
  // 把JSON转成字符串存储到localStorage
  localStorage.setItem('jointjs-kitchensink-workspace', JSON.stringify(workspaceData));
  alert('工作区已成功保存到本地!');
});

方案二:保存到后端服务器(适合实际项目)

如果需要多设备同步或者持久化到数据库,就通过接口把数据发送给后端:

document.getElementById('save-workspace').addEventListener('click', async () => {
  const workspaceData = graph.toJSON();
  try {
    // 发送POST请求到你的后端接口
    const response = await fetch('/api/save-jointjs-workspace', {
      method: 'POST',
      headers: {
        'Content-Type': 'application/json',
        // 如果有用户认证,这里可以加Token
        'Authorization': 'Bearer ' + yourAuthToken
      },
      body: JSON.stringify({
        workspaceData: workspaceData,
        // 可以额外传递工作区名称、用户ID等标识信息
        workspaceName: '我的流程图',
        userId: 'your-user-id'
      })
    });

    if (response.ok) {
      const result = await response.json();
      alert(`工作区已保存,ID:${result.workspaceId}`);
    } else {
      throw new Error('服务器返回错误');
    }
  } catch (error) {
    console.error('保存失败:', error);
    alert('保存出错,请稍后重试');
  }
});

3. 可选:添加加载工作区的功能

配套保存功能,你可以再加个加载按钮来恢复之前的工作区:

<button id="load-workspace" style="margin-left: 10px;">加载工作区</button>
document.getElementById('load-workspace').addEventListener('click', () => {
  // 从localStorage加载(如果是后端存储,就改成请求接口获取数据)
  const savedData = localStorage.getItem('jointjs-kitchensink-workspace');
  if (savedData) {
    // 先清空当前图形,再加载保存的数据
    graph.clear();
    graph.fromJSON(JSON.parse(savedData));
    alert('工作区已成功加载!');
  } else {
    alert('没有找到已保存的工作区');
  }
});

4. 针对Kitchensink示例的注意事项

  • 确保能正确获取到graph实例:Kitchensink示例里的graph可能封装在模块或者特定作用域中,比如如果是用ES模块引入的,要确保变量能访问到。
  • 自定义元素兼容:如果示例里用了自定义形状,只要这些元素已经正确注册到JointJS中,序列化和加载时会自动识别,不需要额外处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:14:51