【问题标题】:Infinite loop when overriding graphHandlerMouseUp on MxGraph using Angular使用 Angular 在 MxGraph 上覆盖 graphHandlerMouseUp 时的无限循环
【发布时间】:2020-03-04 05:53:24
【问题描述】:

我有一个难以解释的问题,就 Javascript、TrueType、Angular 和 MxGraph 方面的专业知识而言,我已经走出了自己的舒适区……希望能够解释一下。

我有一个 Angular 组件显示和 MxGraph。通过此链接 (How to integrate mxGraph with Angular 4?),我能够将 MxGraph 与 Angular 集成。即使我使用 Angular 7,该解决方案仍然有效...

图形在页面上正确显示,一切正常,包括我使用以下代码执行的函数 graphHandlerMouseUp 的覆盖:

// Save the position of the mouse when releasing the button: used for
// detecting the target in a drag and drop
    mx.graphHandlerMouseUp = mx.mxGraphHandler.prototype.mouseUp;
    mx.mxGraphHandler.prototype.mouseUp = function( graph, evt  ) {
      currentdropX = evt.graphX;
      currentdropY = evt.graphY;
      mx.graphHandlerMouseUp.apply(this, arguments);
    }

当我第一次运行这个页面时,没有问题发生。

然后通过一个按钮,我调用一个带有另一个组件的页面(通过路由)。如果从这个页面我回到第一个组件(再次通过路由器链接)页面和带有 MxGraph 的组件正确加载,但是当我使用此功能时(即释放鼠标按钮)。

在我看来这是一个递归问题,就像我这样放置控制台输出时:

// Save the position of the mouse when releasing the button: used for
// detecting the target in a drag and drop
    mx.graphHandlerMouseUp = mx.mxGraphHandler.prototype.mouseUp;
    mx.mxGraphHandler.prototype.mouseUp = function( graph, evt  ) {
      currentdropX = evt.graphX;
      currentdropY = evt.graphY;
      // INIFINTE LOOP HERE
      console.log("Test");
      mx.graphHandlerMouseUp.apply(this, arguments);
    }

“测试”被多次编写,并且不断增长。但是,如果我理解的话,这是覆盖该功能的正确方法。当然,在第一次加载页面时,“测试”会显示一次。传递给另一个组件,然后返回它会显示“无限”次(直到我达到:“错误 RangeError:超出最大调用堆栈大小”)...

我也尝试删除该覆盖,除了明显缺乏功能外,同样的问题也发生在函数“mxDragSource”上,它被相同的方法覆盖。

正如我所说:我在 javascript、truetype、MxGraph 或 Angular 方面不够专业,所以任何提示,即使是显而易见的,都非常受欢迎!

谢谢!

【问题讨论】:

    标签: javascript angular mxgraph


    【解决方案1】:

    第一次运行代码时,将 mx 库的 mouseUp 事件存储在一个变量中,并为 mouseUp 事件分配一个新函数,在该函数中调用旧的 mouseUpEvent。

    第二次运行代码时,存储当前的 mouseUp 事件(已修改)并分配一个函数,在该函数中调用旧的 mouseUpEvent,这与您之前存储的相同。你的递归去了!

    您需要做的是正确覆盖第三方函数,这样您就不会执行两次代码。

    怎么做?

    您可以创建一个 mixin 并在您的 componentB 中使用此 mixin/如果您不知道它是什么以及如何做,请在 stackblitz 中重现您的问题,我很乐意帮助您实现它.

    【讨论】:

    • 感谢您抽出宝贵时间回复!是的,我明白为什么会出现问题,奇怪的是我可以避免第二次重新定义,只需查看“mx.graphHandlerMouseUp”是否已经定义,它适用于这个特定的功能,但我对其他的并不那么幸运同一个库的函数(例如 DragSource)。我查看了 mixins,但您提出的第一个解决方案可能是最好的。然而我认为我仍然不了解整个组件路由中 mx 库的生命周期......我期待这个组件被“销毁”离开页面......
    • 组件确实被销毁了,但是库被缓存了。这就是为什么覆盖通过您的组件导航持续存在的原因。很抱歉,我可以在没有更多代码的情况下为实现提供更多帮助!
    • 谢谢弗洛里安,你已经非常有帮助了,问题现在已经解决了......如果这不是问题,我会有最后一个问题......我怎样才能强制重新加载库以避免使用缓存版本?我问是因为现在不需要这个,但在未来的版本中,第一个组件也需要一个版本的 MXGraph 库,我将在其中覆盖函数。很可能是相同的功能,但不一定是所有功能,也不一定只有这些功能......再次感谢!
    • @Marco 如果您只需要在一个组件中覆盖库函数,并且该组件在任何视图中都没有重复,您可以使用ngOnDestroy。当你销毁组件时,你重新分配你之前覆盖的库方法
    猜你喜欢
    • 2012-07-12
    • 1970-01-01
    • 2020-02-27
    • 2017-01-03
    • 2013-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-02
    相关资源
    最近更新 更多