代码之家  ›  专栏  ›  技术社区  ›  vir us

cytoscape的自定义渲染器问题。js

  •  0
  • vir us  · 技术社区  · 4 年前

    我正试图定制标准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 还有可能更多。

    0 回复  |  直到 4 年前