JSON.stringify()无法保存对象ID Fabric JS

Gen*_*oax 2 javascript canvas fabricjs

我正在为组对象设置id属性

group.id = "N";
canvas.add(group);
canvas.renderAll();
Run Code Online (Sandbox Code Playgroud)

现在,当我使用时序列化画布

JSON.stringify(canvas);
Run Code Online (Sandbox Code Playgroud)

然后使用Json Saved重新加载Canvas

canvas.loadFromJSON(canvas_json , canvas.renderAll.bind(canvas) , function(o , obj)
{
    if(obj.type == 'group')
    {
       console.log('OBJ ID -'+obj.id);
    }
});
Run Code Online (Sandbox Code Playgroud)

我得到了OBJ ID -undefined

我检查了一些涉及子类化的解决方案,但由于我对应用程序非常深入,因此对我来说它不是最好的解决方案.

我试过类似的东西

fabric.Object.prototype.toObject = (function (toObject) {
return function () {
    return fabric.util.object.extend(toObject.call(this), {
        id: this.id
    });
};
Run Code Online (Sandbox Code Playgroud)

但这是徒劳的.我是否必须遍历画布中的每个对象并手动将id属性添加到json?我相信必须有一个更好的解决方案.

在这方面的任何帮助将非常有帮助.

for*_*ert 5

查看对象toObject(propertiesToInclude)上的canvas函数(fabric.js doc).canvas在使用JSON.stringify序列化之前,您应该使用此方法"导出" .该函数允许您提供应包含在序列化中的其他属性的列表.

反序列化时,只需使用该reviver函数将所需属性设置oobj(obj.id = o.id).

把它们放在一起:

var canvas, group; // your canvas and group objects
group.id = 'N';
canvas.add(group)
canvas.renderAll();

var canvasJson = JSON.stringify(canvas.toObject(['id']));

canvas.loadFromJSON(canvasJson, canvas.renderAll.bind(canvas), function(jsonObject, fabricObject) {
    // jsonObject is the object as represented in the canvasJson
    // fabricObject is the object that fabric created from this jsonObject
    if (fabricObject.type === 'group') {
        fabricObject.id = jsonObject.id
    }
});
Run Code Online (Sandbox Code Playgroud)