我正试图定制标准cytoscape的画布渲染器,并面临一个问题。
当我尝试扩展CanvasRenderer,然后将其注册为扩展时,cytoscape会发出警告,但不会注册渲染器:
细胞景观。cjs。js:844无法注册
myRenderer
对于
renderer
自从
clientFunctions
已经存在于原型中,无法
压倒
如果我删除所有“已经存在”的方法(根据源代码,它是
BaseRenderer
),渲染器已成功注册,但初始化失败,出现另一个错误:
打字错误:这个。init不是一个函数
至少。BaseRenderer(cytoscape.cjs.js:26770)
好吧,让我们带上
init
返回但现在我们又回到了最初的问题:
细胞景观。cjs。js:844无法注册
myRenderer
对于
渲染器
自从
初始化
已存在于原型中,无法重写
我是这样做的:
let CanvasRenderer = cytoscape('renderer', 'canvas')
let MyRenderer = function (options) {
CanvasRenderer.call(this, options)
}
MyRenderer.prototype = Object.create(CanvasRenderer.prototype)
cytoscape('renderer', 'myRenderer', MyRenderer) //<- here I got the warnings and the renderer is not added.
这就是我删除“已经存在”属性的方式:
let BaseRenderer = cytoscape('renderer', 'base');
Object.keys(BaseRenderer.prototype).forEach(function(key) {
MyRenderer.prototype[key] = null
});
我唯一能让一切正常工作的方法就是修改cytoscape的源代码。删除检查属性是否存在的逻辑:
从…起
cytoscape.js/src/extension.js
:
...
for (var pName in bProto) {
var pVal = bProto[pName];
var existsInR = rProto[pName] != null;
if (existsInR) { //when I comment this 'if' block, everything works as expected.
return overrideErr(pName);
}
proto[pName] = pVal; // take impl from base
}
...
但这违背了扩展的目的。
那么,如何正确地扩展画布渲染器,从而基于它创建自定义渲染器呢?
我希望覆盖与绘制边相关的方法,比如
findEdgeControlPoints
,
drawEdgePath
还有可能更多。