【发布时间】:2014-01-23 01:16:53
【问题描述】:
我正在将 Fabric js 用于我正在从事的项目并遇到一些困难。我的目标是允许用户在表单中输入详细信息。然后表单将转换为 JSON 对象并使用本地存储进行存储。
按下提交后,用户将被带到一个新页面,在该页面中检索 JSON 并创建对象。
我在后面的部分有困难。将表单中的信息转换为 JSON 工作正常,各种测试表明输出是应有的。
创建对象时出现问题,对象在画布上显示为带角的简单边框,可以移动和选择它,但所有其他属性(例如大小和颜色)都丢失了。我认为这是因为 JSON 是如何被反序列化的。我一直在寻找解决方案,但尚未找到,非常感谢任何帮助。
示例代码:
这是我的测试实例,它按预期创建了一个对象:
var a = {
type: "rect",
left:200,
top:110,
fill:'red',
width:80,
height:50
};
同上,但来自本地存储:
[Log] From JSON: {"type":"rect","top":"110","left":"200","fill":"red","height":"50","width":"80"} (sim.html, line 135)
要获取我正在使用的数据:
var test = localStorage.getItem("Number1");
console.log("From JSON: " +test);
var obj = JSON && JSON.parse(test) || $.parseJSON(test);
console.log(obj.type +"-"+ obj.left);
在下面的方法中添加 a 时,它可以工作,但 obj 不能。我可以看到报价的主要区别,但我不确定这是否是问题,如果是,如何简单地删除它。
迭代和渲染对象的函数:
fabric.util.enlivenObjects([circle1, obj], function(objects) {
var origRenderOnAddRemove = canvas.renderOnAddRemove;
canvas.renderOnAddRemove = false;
objects.forEach(function(o) {
canvas.add(o);
});
canvas.renderOnAddRemove = origRenderOnAddRemove;
canvas.renderAll();
});
非常感谢您的帮助。
【问题讨论】:
-
您的 JSON 对我来说看起来不正确 - 数字都是字符串。如何将对象放入存储?
-
你应该使用
JSON.stringify( object )。 edit 嗯好的 - 您保存的对象与“a”对象不相同,因为您将表单字段保存为字符串而不是数字。我不知道这是否是问题的原因。 -
是的,抱歉我更新了那条评论。
-
好吧,表单字段值总是字符串,所以在某些时候代码必须知道哪些需要转换为数字。 (再次,假设数字/字符串确实是问题所在。)这种转换可能在您序列化表单时发生,也可能稍后发生。
-
也许您可以修改序列化程序代码,以便它可以在输入元素上查找“数字”类,并在此时转换它们。
标签: javascript json local-storage deserialization fabricjs