0

我正在尝试使用 Cytoscape 和 AngularJS 1.6 创建网络工作流创建两个节点后,用户能够在它们之间创建边缘。为此,我使用cy.on('cxttap')cytoscape 函数来检测两个节点上的右键单击,然后插入新边缘。这工作正常。直到我添加了一个新视图,用户可以在其中看到数据库中保存的工作流。问题是,如果我打开查看选项卡,然后返回创建选项卡,该cy.on('cxttap')函数会被调用两次,并且在 cytoscape 画布上插入两条边,但在我的范围变量中只创建了一个条目。我曾经为这两个视图使用相同的工厂,但现在我为每个视图使用不同的角度工厂。

如果我多次打开这些选项卡之间的切换,我打开查看选项卡的次数是调用函数的次数,因此更多的行数。

这里 ( https://jsfiddle.net/y47kwpg7/4/ ) 是我的视图及其控制器的代码片段。“创建视图”-->“MlalTextWorkflowGeneratorCtrl”和“查看视图”-->“MlalTextWorkflowViewerCtrl”。

(请原谅我,我不知道如何使它在单个文件中工作)

我在这里的工厂是用于 cytoscape 画布的,并且有一个类似的用于另一个视图,但具有不同的 id 选择。

谢谢您的帮助!

4

2 回答 2

1

你要么需要

(1) 如果您正在重用实例,请删除旧的侦听器,或者

(2) 每次创建新视图时都创建一个新实例。

于 2017-07-10T14:38:30.177 回答
1

@maxkfranz 的回答引导我进行更多调试,最后我发现了问题。

问题是我有一些从控制器调用的侦听器函数,以便检测 cytoscape 节点上的事件。并且要触发的侦听器存储在变量 workflowGraph.listeners 中。你可以看到旧代码 [] 1。问题是这个变量在我的控制器重新加载时没有清空,因为我从我的控制器调用监听器,它们再次被添加到这个变量中。因此,一个侦听器需要调用多个函数。

我用来解决这个问题的方法是创建一个我之前为 cytoscape 事件创建的新“listener”类型函数,每次加载控制器时我都会调用它,以清空我的 cytoscape 工厂的 listeners 变量。

在细胞景观工厂

    workflowGraph.reinitialize = function () {
        workflowGraph.listeners = {};
    };

在控制器中

workflowCreation是工厂的名字

  workflowCreation.reinitialize();

这将简单地从工厂清空 listeners 变量。

请记住在 cytoscape 初始化之后和调用任何其他侦听器函数之前在控制器中调用它

希望这可以帮助某人。

于 2017-07-11T13:39:05.530 回答