Fabric.js - 如何使用自定义属性在服务器上保存画布

2023-12-13

我希望能够将当前画布的状态保存到服务器端数据库,可能作为 JSON 字符串,然后使用以下命令恢复它loadFromJSON。通常,这可以使用以下方法轻松完成:

var canvas = new fabric.Canvas();
function saveCanvas() {
    // convert canvas to a json string
    var json = JSON.stringify( canvas.toJSON() );

    // save via xhr
    $.post('/save', { json : json }, function(resp){ 
        // do whatever ...
    }, 'json');
}

进而

function loadCanvas(json) {

  // parse the data into the canvas
  canvas.loadFromJSON(json);

  // re-render the canvas
  canvas.renderAll();

  // optional
  canvas.calculateOffset();
}

但是,我还使用内置函数在要添加到画布的织物对象上设置了一些自定义属性Object#set method:

// get some item from the canvas
var item = canvas.item(0);

// add misc properties
item.set('wizard', 'gandalf');
item.set('hobbit', 'samwise');

// save current state
saveCanvas();

问题是,当我在服务器端检查请求时,我发现我的自定义属性没有从画布中解析并与其他所有内容一起发送。这可能与如何toObject方法删除对象类中非默认属性的所有内容。解决这个问题的好方法是什么,这样我就能够同时保存and从服务器发送的 JSON 字符串恢复画布,恢复的画布还将包含我的自定义属性?谢谢。


好问题。

如果您向对象添加自定义属性,这些对象可能在某种程度上是“特殊的”。似乎对它们进行子类化是一个合理的解决方案。

例如,下面是我们如何子类化一个fabric.Image到命名图像中。这些图像对象可以有“Gandalf”或“Samwise”等名称。

fabric.NamedImage = fabric.util.createClass(fabric.Image, {

  type: 'named-image',

  initialize: function(element, options) {
    this.callSuper('initialize', element, options);
    options && this.set('name', options.name);
  },

  toObject: function() {
    return fabric.util.object.extend(this.callSuper('toObject'), { name: this.name });
  }
});

首先,我们给这些对象一个类型。该类型用于loadFromJSON自动调用fabric.<type>.fromObject方法。在这种情况下,它将是fabric.NamedImage.fromObject.

然后我们覆盖initialize(构造函数)实例方法,在初始化对象时还设置“name”属性(如果给出了该属性)。

然后我们覆盖toObject实例方法在返回的对象中包含“名称”(这是结构中对象序列化的基石)。

最后,我们还需要实现fabric.NamedImage.fromObject我之前提到过,所以loadFromJSON会知道在 JSON 解析期间调用哪个方法:

fabric.NamedImage.fromObject = function(object, callback) {
  fabric.util.loadImage(object.src, function(img) {
    callback && callback(new fabric.NamedImage(img, object));
  });
};

我们在这里加载一个图像(来自“object.src”),然后创建一个实例fabric.NamedImage出来了。请注意,此时构造函数将已经处理“名称”设置,因为我们之前覆盖了“初始化”方法。

我们还需要指定fabric.NamedImage是一个异步“类”,这意味着它fromObject不返回实例,而是将其传递给回调:

fabric.NamedImage.async = true;

现在我们可以尝试一下:

// create image element
var img = document.createElement('img');
img.src = 'https://www.google.com/images/srpr/logo3w.png';

// create an instance of named image
var namedImg = new fabric.NamedImage(img, { name: 'foobar' });

// add it to canvas
canvas.add(namedImg);

// save json
var json = JSON.stringify(canvas);

// clear canvas
canvas.clear();

// and load everything from the same json
canvas.loadFromJSON(json, function() {

  // making sure to render canvas at the end
  canvas.renderAll();

  // and checking if object's "name" is preserved
  console.log(canvas.item(0).name);
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Fabric.js - 如何使用自定义属性在服务器上保存画布 的相关文章

  • 使用Python将文本文件导入Access 2003数据库

    我正在尝试使用我正在开发的 Python 3 4 应用程序将管道分隔的文本文件导入到具有现有表的 Access 数据库中 但遇到了一些麻烦 该应用程序将用于导入不同的文本文件 因此我使用条目小部件来写入文件名 并且我希望将输入的文件的内容加
  • Spring REST 控制器返回带有空数据的 JSON [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我有一个简单的 Spring Boot Web 应用程序 我正在尝试从服务器接收一些数据 控制器返回一个集合 但浏览器收
  • REST API 由于 CSRF 检查,同时发布两个具有不同属性的请求失败,状态代码为 403

    我使用 REST API 发送两个发布请求 http localhost 8111 app rest buildQueue但我的第二个请求失败了 403 Forbidden 由于 CSRF 检查失败而响应 403 状态代码 不存在 Orig
  • MySQL 8 用逗号分割字符串并将其转换为JSON ARRAY

    我有以下字符串 a b c d 我想将它转换成一个 json 数组 像这样 a b c d MySQL 8 有什么函数可以实现这个功能吗 Try SELECT CAST CONCAT REPLACE a b c d AS JSON See
  • bash 脚本抱怨文件名太长

    所以我有一个脚本可以执行此操作 jq 是命令行 JSON 处理器 echo Getting LB Node IDs echo LB STATUS jq loadBalancer nodes id 最后一行的输出是 1 2 3 但是当我尝试将
  • 串行类型的外键 - 确保始终手动填充

    我有两个表 国家和地区 CREATE TABLE Countries id SERIAL name VARCHAR 40 NOT NULL PRIMARY KEY id CREATE TABLE Regions id SERIAL coun
  • Struts2 中有多种结果类型?

    我有一个使用 Tiles 的 Struts2 应用程序 如何在操作映射中获取多种结果类型 因为我需要将de输出设置为JSON数据 并且同时Tiles 我努力了
  • 如何阅读网站内容?

    我是使用 python 2 7 的网络爬虫的新手 一 背景 现在 我想收集有用的数据AQICN org http aqicn org city shenyang usconsulate 这是一个很棒的网站 提供世界各地的空气质量数据 我想用
  • Twitter api 文本字段值被截断

    为什么文本字段值被截断以及如何获得完整的值 截至目前 我正在尝试获取如下所示的文本字段值 do if let responseObject try NSJSONSerialization JSONObjectWithData respons
  • Sequelize.js 中的自定义或覆盖连接

    我需要使用创建自定义连接条件Sequelize js http sequelizejs com使用 MSSQL 具体来说 我需要加入TableB基于一个COALESCE中的列的值TableA and TableB并最终得到这样的连接条件 L
  • BigQuery 如何获取 JSON 结构中的值的总和?

    我有以下查询 SELECT JSON EXTRACT json Weights as weight from select Weights blue 1 0 purple 0 0 yellow 1 0 green 1 0 as json 返
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • 数据库字段中的逗号分隔值

    我有一个产品表 该表中的每一行对应一个产品 并由唯一的 ID 标识 现在 每个产品都可以有多个与该产品关联的 代码 例如 Id Code 0001 IN ON ME OH 0002 ON VI AC ZO 0003 QA PS OO ME
  • rake db:migrate db:reset 和 db:schema:load 之间的区别

    和 之间的不同rake db migrate and rake db reset我很清楚 我不明白的是如何rake db schema load与前两者不同 只是为了确保我在同一页面上 rake db migrate 运行尚未运行的迁移 r
  • 删除数据库中的行后如何重新排序ID

    我正在使用 C 来制作具有 sql 数据库的程序 在数据库中我有一个名为Workers 它有一个自动增量和主键ID column 当我删除一条记录时 ID 之间会出现间隙 删除记录后如何重新排序 ID UPDATE 我要做的就是找到记录后将
  • 无法在 Sqlite3 中添加默认值为 NULL 的 NOT NULL 列

    尝试将 NOT NULL 列添加到现有表时出现以下错误 为什么会发生这种情况 我尝试了 rake db reset 认为现有记录是问题所在 但即使重置数据库后 问题仍然存在 你能帮我解决这个问题吗 迁移文件 class AddDivisio
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • Flutter 中有预填充数据库使用的示例吗?

    Flutter 中有预填充数据库使用的示例吗 我不需要 CRUD 示例 此时我只需要从数据库读取数据即可 我是 Flutter 新手 所以一步一步的教程会很好 您可以将您的应用程序与预填充的 sqlite 数据库捆绑在一起assets文件夹
  • JSON:TypeError:Decimal('34.3')不是JSON可序列化的[重复]

    这个问题在这里已经有答案了 我正在运行一个 SQL 查询 它返回一个小数列表 当我尝试将其转换为 JSON 时 出现类型错误 查询 res db execute SELECT CAST SUM r SalesVolume 1000 0 AS

随机推荐

  • 如何在 Hibernate 应用程序中处理数据库空值?

    由于数据库表中的空值 我收到 org hibernate PropertyAccessException 异常如何处理 我的文件是 获取测试 java package com raj java hiberanteDemos import o
  • 是否可以将 NFC 信号从 NFC 读/写器发送到 Iphone

    我正在创建一个移动应用程序 它根据 PC 上生成的 ID 获取数据 我想将此 ID 作为文本字符串从我的 NFC 设备传递 当用户触摸 NFC 设备时 该设备支持读取和写入 iPhone 设备 这可能吗 我使用 Acr 122u 作为 NF
  • 在android中设置listview滚动动画

    我想为一个设置动画ListView当用户滚动ListView 我正在设置动画ListView加载时 但我想设置滚动动画 这是我在 eclipse 中的动画文件
  • Linkedin v2 API 图片上传出现错误 400 Bad Request

    当我每次尝试使用 LinkedIn v2 API 上传图像时 都会收到 400 Bad request 错误 参考资料取自这里 Link 我在邮递员中执行的步骤 步骤1 应用程序编程接口 https api linkedin com v2
  • MySql修改预购树创建url

    这个问题是基于我之前的问题堆栈溢出 这次我尝试使用修改后的预购树方法为页面表中的所有行生成 url 以下是 MySql 表 注意 我添加了 父 列 只是为了让查看者了解类别表中的父子关系 实际的Modified Preorder Tree方
  • 是否可以镜像 ActiveMQ 中的单个队列?

    我在生产系统中运行 ActiveMQ 我们的一些队列数量非常多 有些队列数量非常少 我有兴趣镜像低容量队列之一 以便我可以围绕收到的消息构建非正式的监视服务 很遗憾 我能找到的唯一文档似乎暗示镜像队列是全有或全无 您要么为您拥有的每个队列创
  • 如何将日期时间选择器添加到 contenteditable

    如何使用 jquery 在可编辑的内容中添加日期和时间选择器 这是我的 td td class dq1 row dq1 td 这是我的脚本 datepicker datepicker dateFormat yyyy mm dd showOn
  • 使用 Direct X 和 VS2012

    我拥有适用于桌面版和适用于 Windows 8 的 Visual Studio 2012 Express 并且我想创建 Direct X 应用程序和游戏 我知道现在有一个Windows SDK 并且在win8的VS 2012 exp中IDE
  • “提交”审核按钮变灰 - Xcode 6 [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 我正在尝试提交我的第一个 iOS 8 应用程序 并且正在执行 Apple iTunes 连接的新程序 我已经上传了我的二进制文件 填写了所有详细信息并上传了所有屏幕截图 然后
  • 匹配 [g]awk 中的数字

    我被难住了 尝试编写 awk 正则表达式来将字符串与 11 位数字进行匹配 我试过了 if var 0 9 11 if var 0 9 11 if var 0 9 11 if var 0 9 11 altho I really do nee
  • Qt 调整轴不会调整图表本身

    我目前正在尝试了解 Qt 中的折线图 由于某种原因 我的图表似乎显示出非常奇怪的行为 当我使用 createDefaultAxis 时 它将根据图表后面系列的最小值和最大值设置最小值和最大值 虽然乍一看这似乎没问题 但它已经与中的行为不同了
  • JavaScript 原生 groupBy 减少

    我正在使用 JavaScript 原生reduce 但是我想稍微改变一下分组以获得我想要的结果 我有一个数组如下 const people name John age 23 city Seattle state WA name Mark a
  • 是否可以在VBA中将Excel表转换为json

    我需要将大约二十列和很多行的 Excel 表中的数据转换为 json 我在 vba 中没有找到用于此目的的简短代码示例 我找到了这个https github com VBA tools VBA JSON blob master JsonCo
  • 从表中选择一组动态列并获取每个列的总和

    是否可以在 Postgres 中执行以下操作 SELECT column name FROM information schema WHERE table name somereport AND data type integer SELE
  • 表单集中的表单如何知道它在表单集中的索引?

    我有一个基本的 Form 子类 其中生成了一个表单集 例如 MyFormset formset factory MyForm extra 5 max num 5 我希望能够从内部访问表单的索引form save and form init
  • 从mapView中删除用户位置注释

    我必须删除添加到 MKMapView 中的所有注释 但是当我执行时 NSMutableArray annotationsToRemove NSMutableArray alloc initWithArray mapView annotati
  • 在html表(jsp页面)中输出JSON数组

    正如标题所示 如何从 JSP 页面的表中正确输出 JSON 数组 现在每当我使用显示 JSON 数组对象时
  • 使用异步委托/lambda 进行投影

    以下代码不会针对 Visual Studio 2010 中的异步 CTP 进行编译 Enumerable Range 1 5 Select async x gt await TaskEx Delay 100 return 5 编译错误如下
  • 谷歌分析抛出403错误

    我正在尝试使用 C 从 Google Analytics 下载指标数据 并使用 OAuth 2 0 执行用户身份验证 我正在使用已安装的应用程序授权流程 需要登录 Google 并将代码复制粘贴到应用程序中 我正在关注来自的代码谷歌 API
  • Fabric.js - 如何使用自定义属性在服务器上保存画布

    我希望能够将当前画布的状态保存到服务器端数据库 可能作为 JSON 字符串 然后使用以下命令恢复它loadFromJSON 通常 这可以使用以下方法轻松完成 var canvas new fabric Canvas function sav