我有自己的类PersonTextBox
继承自Fabric Textbox
。
另外,我需要为文本框重新定义函数initialize
,以稍微更改类型为Textbox
和PersonTextBox
的对象的行为。
我以以下方式实现了它:
fabric.PersonTextBox = fabric.util.createClass(fabric.Textbox, fabric.Observable, {
type: 'personTextBox'
});
/**
* Redefine function initialize.
*/
fabric.Textbox.prototype.initialize = function(text, options) {
this.fillHtmlStyle(text);
this.callSuper('initialize', text, options);
this.setControlsVisibility(fabric.Textbox.getTextboxControlVisibility());
this.ctx = this.objectCaching ? this._cacheContext : fabric.util.createCanvasElement().getContext('2d');
// add width to this list of props that effect line wrapping.
this._dimensionAffectingProps.push('width');
};
/**
* Fill source text.
* @text - plain text without html.
*/
fabric.Textbox.prototype.fillHtmlStyle = function(text) {
this.htmlStyle = '<p>' + text + '</p>';
};
var canvas = new fabric.Canvas('c');
canvas.add(new fabric.PersonTextBox('My text'));
canvas.renderAll();
<script src="https://cdnjs.cloudflare.com/ajax/libs/fabric.js/1.7.7/fabric.min.js"></script>
<body>
<canvas id="c" width="1000" height="1000"></canvas>
</body>
JSFiddle https://jsfiddle.net/Eugene_Ilyin/p6ep1dfb/
如您所见,控制台中出现一个错误:
fabric.js:1922 Uncaught RangeError: Maximum call stack size exceeded
at klass.callSuper (VM123 fabric.js:1922)
at klass.fabric.Textbox.initialize ((index):55)
at klass.callSuper (VM123 fabric.js:1925)
at klass.fabric.Textbox.initialize ((index):55)
at klass.callSuper (VM123 fabric.js:1925)
at klass.fabric.Textbox.initialize ((index):55)
at klass.callSuper (VM123 fabric.js:1925)
at klass.fabric.Textbox.initialize ((index):55)
at klass.callSuper (VM123 fabric.js:1925)
at klass.fabric.Textbox.initialize ((index):55)
我发现在结构 v1.7.20 中它可以工作,但在 v1.7.7 中它不起作用。为什么我做错了,我该如何纠正这个错误?
提前致谢
作为解决方案,我将我的 fabric.js 库更新到 1.7.10 版,它有所帮助。
另外,我发现了一个描述此错误的问题 https://github.com/kangax/fabric.js/pull/3844
但是我在另一种情况下再次遇到这个问题。检查代码后,我发现当开发人员创建新类时,他应该使用 fabric.util.createClass。此函数调用函数 addMethods。它允许通过继承链调用函数。
结论是,通过原型覆盖方法是织物.js不正确的方法。如果需要重写某些函数,则应创建自己的类。也许在某些情况下,通过原型覆盖功能会起作用。但不是在被覆盖的函数中有"callSuper"的情况下。
附言我不建议在 1.7.10 上更新,这个版本有一个带有 SVG 路径的错误。