【发布时间】:2014-09-06 06:06:35
【问题描述】:
我过去曾使用 fabricjs 成功地对组进行子类化,但是在尝试对 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。您可以在第 124、125 行看到我添加了对附加了端点和箭头的行的引用:
arrow.line = line;
end.line = line;
当您尝试序列化(检查控制台)时,正是这个引用引发了错误:
【问题讨论】:
-
+1 尝试添加一个JSFiddle的例子
-
@wintermute 我刚刚添加了,看上面的编辑
-
你的序列化代码陷入无限递归,这条语句end.line = line;是负责任的,end.line点对线,而line.end点对端
-
啊,我明白@wintermute 你的意思了,那么如何保留对端点所属行的引用(然后是行的端点),还是应该在其他地方保存该引用?不过,它确实给了我一个新的思路,谢谢。请记住将您的答案添加为答案而不是评论,以便如果它是解决方案,我可以投票。
标签: javascript fabricjs