FabricJS:次分类织物.行和toObject错误
FabricJS: Sub Classing fabric.Line and toObject error
我过去曾用fabricjs成功地将Groups子类化,但在尝试将Line对象子类化时,toObject()
方法遇到了各种问题。
目前我的代码如下:
fabric.ConnectorLine = fabric.util.createClass(fabric.Line, {
initialize: function (points, options) {
options || (options = {});
this.callSuper('initialize', points, options);
options &&
this.set('type', 'connector') &&
this.set('end1', options.end1) &&
this.set('arrow', options.arrow)
},
toObject: function () {
return fabric.util.object.extend(this.callSuper('toObject'), {
type: this.type,
end1: this.end1,
arrow: this.arrow
});
}
});
fabric.ConnectorLine.fromObject = function (object, callback) {
var _enlivenedObjects;
fabric.util.enlivenObjects(object.objects, function (enlivenedObjects) {
delete object.objects;
_enlivenedObjects = enlivenedObjects;
});
return new fabric.ConnectorLine(_enlivenedObjects, object);
};
当我尝试序列化这个对象时,我得到以下错误消息:
RangeError: Maximum call stack size exceeded
at klass.callSuper (fabric.js:1475:30)
at klass.fabric.Line.fabric.util.createClass.toObject (fabric.js:13632:26)
对于带有Lines的toObject
方法(Rect和Triangle似乎也有同样的问题),您需要做一些特殊的事情吗?
我的脑袋几乎进水了,所以任何帮助都是非常感激的。
更新1:jsfiddle添加
下面是一个基本示例的jsfiddle。你可以在第124125行看到,我添加了一个引用到一行,末尾和箭头连接到:
arrow.line = line;
end.line = line;
当您尝试序列化(检查控制台)时,正是这个引用抛出了错误:
http://jsfiddle.net/iamadamjowett/zL5k0zx3/29/
正如我在上面的注释中所写的,您的序列化失败是因为行组件、端组件和箭头组件相互之间有循环引用,所以当您序列化行时,请序列化序列化行的端,序列化端,依此类推,直到您陷入堆栈溢出异常。
我建议你改变你的设计,改为使用一个组,并将你的线条、末端和箭头添加到组中;扩展组应该是最好的选择,你可以把它想象成一个单独的组件,其中有3个子组件没有被严格引用。
我尝试了一个丑陋肮脏的解决方案,但不是我想要的:
fabric.ConnectorEnd = fabric.util.createClass(fabric.Rect, {
initialize: function (options) {
options || (options = {});
this.callSuper('initialize', options);
recursionCount = 0;
options &&
this.set('type', 'connector-end') &&
this.set('line', options.line) &&
this.set('attachedTo', options.attachedTo) &&
this.set('attachedPos', options.attachedPos)
},
toObject: function () {
if (recursionCount > 100) return; // added a recursion limit
recursionCount++;
return fabric.util.object.extend(this.callSuper('toObject'), {
type: this.type,
line: this.line,
attachedTo: this.attachedTo,
attachedPos: this.attachedPos
});
}
});
不会工作。。。
fabric.ConnectorEnd = fabric.util.createClass(fabric.Rect, {
initialize: function (options) {
options || (options = {});
this.callSuper('initialize', options);
options &&
this.set('type', 'connector-end') &&
this.set('line', options.line) &&
this.set('attachedTo', options.attachedTo) &&
this.set('attachedPos', options.attachedPos) &&
this.set('recursions', 0)
},
toObject: function () {
if (this.line.recursions > 0 && this.recursions > 1) { return; }
return fabric.util.object.extend(this.callSuper('toObject'), {
recursions: this.recursions++,
type: this.type,
line: this.line,
attachedTo: this.attachedTo,
attachedPos: this.attachedPos
});
}
});
不会工作。。。可怕而无用。。。我该如何建议你使用这种糟糕的代码?我能做什么?没错,我发现在JSON中管理循环引用的唯一解决方案是Douglas Crockford的Cycle.js,但要使用它,您应该修改FabricJS的.toJSON()
方法。
我的意见是使用属性ID和FindById方法,或者使用字符串属性来字符串化引用,但如果可以的话,尽量避免循环引用。
- 可以'我不明白为什么;t将行和单元格添加到表中
- KnockoutJS更新行和字段
- 编辑不起作用的表单的特定行和重置特定字段
- ext.js根据行和单元格索引隐藏某些单元格
- 如何突出显示手动联系人的选定行和标题
- 获取命名单元格的行和列索引
- 如何使用jQuery和乘法行和列创建HTML表
- 如何在 Angular UI 日期选择器中格式化行和月份名称
- 带有文本框的行和列的ASP.NET表总和
- post-router的req.body包含新行和冒号
- 获取文本区域中字符的行和列
- 木偶骨干 如何制作带有动态行和列标题的网格表
- 单击表格行和单元格
- 如何查找具有行和列索引的特定单元格的内容
- 带有行和列偏移的Javascript的Eval字符串
- jQuery追加行和列
- 在没有jQuery的JavaScript中查找单击的表单元格的行和列
- 如何在contenteditable上实现换行和分段
- jQuery 以突出显示表中选定的行和列
- FabricJS:次分类织物.行和toObject错误