Javascript 如何在fabric js版本1.7.22中使用自定义属性从json加载对象后创建对象组?

Javascript 如何在fabric js版本1.7.22中使用自定义属性从json加载对象后创建对象组?,javascript,fabricjs,Javascript,Fabricjs,我使用的是fabricJS版本1.7.22。 我想实现分组和取消分组的功能 当我使用toJSON(自定义属性的列表)将画布转换为json时。我的自定义属性未添加到json中。(包含在组中的子对象的自定义属性不会添加到json中) 是否有用于分组的修补程序,以便每次“我的所有自定义属性”都是外接程序组的对象时 我的分组代码如下(我从最新的fabricJS版本2.7.0的fabricJS toGroup()函数中借用了这段代码): 我尝试了一些可能有助于理解问题的场景。 (我的所有画布对象必须包含名

我使用的是fabricJS版本1.7.22。 我想实现分组和取消分组的功能

当我使用toJSON(自定义属性的列表)将画布转换为json时。我的自定义属性未添加到json中。(包含在组中的子对象的自定义属性不会添加到json中)

是否有用于分组的修补程序,以便每次“我的所有自定义属性”都是外接程序组的对象时

我的分组代码如下(我从最新的fabricJS版本2.7.0的fabricJS toGroup()函数中借用了这段代码):

我尝试了一些可能有助于理解问题的场景。 (我的所有画布对象必须包含名为“id”的自定义_属性)

1) 添加一个图像并克隆该图像。现在将画布转换为json。(JSON包含我的所有自定义属性,如=>[rect[id],circle[id]])

2) 添加一个映像并克隆该映像,然后对这两个映像进行分组。现在将画布转换为json。(JSON包含我的所有自定义属性,如下所示:=>group(rect[id],circle[id]))

3) 添加一个图像并克隆该图像。现在将画布转换为json(这类似于第一个场景)。现在清除画布并再次将json加载到画布中。现在将这两个对象组合成一组。并将画布转换为json,如下所示=>group(rect[],circle[])

主要问题是在执行loadfromJSON之后。(场景3)loadfromJSON之后,我的组对象不包含自定义属性。因为我的画布json不包含该属性。

获取json使用和克隆使用

var canvas=document.getElementById('c');
var c=新织物画布(Canvas);
c、 设定高度(500);
c、 设定宽度(500);
var allCustomAttr=['customSourceType','id'];
var groupbtn=document.getElementById('group');
var unGroupbtn=document.getElementById('ungroup');
var reload=document.getElementById('reload');
var getJSON=document.getElementById('getJSON');
选择var;
函数扩展(对象,属性){
//对象集(attr);
object.toObject=(函数(toObject){
返回函数(){
返回fabric.util.object.extend(toObject.call(this),attr);
};
})(object.toObject);
}
c、 在({
“对象:选定”:函数(e){
所选=e.目标;
console.log('selected',selected);
log('selected',selected.toJSON(allCustomAttr));
}
})
getJSON.addEventListener('click',function(){
log('canvas json',c.toJSON(allCustomAttr));
});
reload.addEventListener('click',function(){
var json=c.toJSON(allCustomAttr);
c、 清除();
c、 loadFromJSON(json,函数(){
c、 renderAll();
})
});
ungroup btn.addEventListener('click',function(){
var activeObject=c.getActiveObject();
if(activeObject&&activeObject.type!=“组”){
返回;
}
var items=activeObject.getObjects();
activeObject.destroy();
c、 移除(activeObject);
对于(变量i=0;i{
element.clone((clonedElement)=>{
grp.addWithUpdate(克隆元素);
});
});
玻璃钢套({
top:activegroup.top,
左:activegroup.left
})
c、 丢弃活动组();
c、 取消激活AllWithDispatch();
objectsInGroup.forEach(函数(对象){
c、 移走(物体);
});
c、 添加(grp);
c、 renderAll();
});
var rect=new fabric.rect({
身高:100,
宽度:100,
前100名,
左:100,,
填充:“红色”
});
扩展(rect{
“customSourceType”:“rect”,
“id”:123456
})
c、 添加(rect);
var text=new fabric.IText('这是文本'{
填充:“绿色”,
排名:150,
左:220,
尺寸:30
});
扩展(文本{
“customSourceType”:“ITEXT”,
“id”:987654
})
c、 添加(文本)

从json加载
团体
解组
获取json
  • 选择对象并将其分组
  • 现在选择该组。和值机控制台
  • 请检查第二个日志。(在所选事件上放置了两个日志。)
  • (控制台)组中存在对象数组
  • 展开rect对象(数组的第一个对象)
  • 尝试查找自定义属性(customSourceType,id)

  • 以上步骤将是完美的
  • 现在单击loadFromJson按钮
  • 现在选择该组。和值机控制台
  • 请检查第二个日志。(在所选事件上放置了两个日志。)
  • (控制台)组中存在对象数组
  • 从该数组展开rect对象(数组的第一个对象)
  • 尝试查找自定义属性(customSourceType,id)
  • loadfromjson之后,没有自定义属性

  • 我也有同样的问题,实际上我已经用旧版本创建了我的项目。正在考虑转换为最新版本。您需要使用
    fabricjs
    标记not
    fabric
    。您能用您的代码创建一个小提琴吗,我不能?我也有同样的问题,我不能在小提琴中生成问题,我仍然附加旧的fabricjs。我会尽量和大家分享小提琴。当前无法访问JSFIDLE站点。很抱歉,迟到了。这是一个问题:步骤是用小提琴写的。
    var activeObject = this.canvas.getActiveGroup();
        var objects = activeObject._objects.concat();
        activeObject._objects = [];
        var options = fabric.Object.prototype.toObject.call(activeObject);
        var newGroup = new fabric.Group([]);
        delete options.type;
        newGroup.set(options);
        objects.forEach(function (object) {
            if (object) {
                object.canvas.remove(object);
                object.group = newGroup;
            }
        });
        newGroup._objects = objects;
        if (!activeObject.canvas) {
            return newGroup;
        }
        else {
            var canvas = activeObject.canvas;
            that.extend(newGroup, that.randomId());
            canvas.add(newGroup);
            canvas._activeObject = newGroup;
            newGroup.setCoords();
        }