我正在尝试使用Cytoscape和AngularJS 1.6创建网络工作流程
创建两个节点后,用户可以在它们之间创建边缘。为此,我使用cy.on('cxttap')
cytoscape函数来检测两个节点上的右键单击,然后插入新的边缘。
这很好用。在我添加新视图之前,用户可以从数据库中查看已保存的工作流。问题是,如果我打开“查看”选项卡然后返回到创建选项卡,cy.on('cxttap')
函数将被调用两次,并且在cytoscape画布上插入两条边,但在我的范围变量中只有一个条目。我曾经为两个视图拥有相同的工厂,但现在我为每个视图使用不同的角度工厂。
如果我多次打开这些标签之间的切换,我打开观看标签的次数是调用该功能的次数,因此更多的是行数。
此处(https://jsfiddle.net/y47kwpg7/4/)是我的视图与其控制器的代码的代码段。 “创造观” - > “MlalTextWorkflowGeneratorCtrl”和“Viewing View” - > “MlalTextWorkflowViewerCtrl”。
(请原谅我,我不知道如何让它在单个文件中工作)
我在这里的工厂是用于cytoscape画布,并且有一个类似的用于另一个视图,但具有不同的id选择。
感谢您的帮助!
答案 0 :(得分:1)
您需要
(1)如果您正在重新使用实例,则删除旧的侦听器,或
(2)每次创建新视图时都创建一个新实例。
答案 1 :(得分:1)
@maxkfranz的回答引导我做了一些调试,最后我发现了问题。
问题是我有一些监听器功能,我从我的控制器调用,以检测cytoscape节点上的事件。并且将要触发的侦听器存储在变量workflowGraph.listeners中。你可以看到旧代码[] 1。问题是,当我的控制器被重新加载时,这个变量没有被清空,因为我从我的控制器调用了监听器,它们再次被添加到这个变量中。因此,一个监听器有多个函数可以调用。
我用来解决这个问题的方法是创建一个新的“监听器”类型函数,我之前用于cytoscape事件,我每次加载控制器时都会调用它,以清空我的cytoscape工厂的监听器变量。
在cytoscape工厂
workflowGraph.reinitialize = function () {
workflowGraph.listeners = {};
};
在控制器中
workflowCreation
是工厂的名称
workflowCreation.reinitialize();
这只是从工厂清空侦听器变量。
请记住在进行cytoscape初始化之后和调用任何其他侦听器功能之前在控制器中调用此方法
希望这有助于某人。