2017-07-09 4 views
0

Ich versuche, einen Netzwerk-Workflow mit Cytoscape und AngularJS 1.6 erstellen Nach dem Erstellen von zwei Knoten ist der Benutzer in der Lage, eine Kante zwischen ihnen zu erstellen. Dazu verwende ich cy.on('cxttap') Cytoscape-Funktion, um rechte Klicks auf beiden Knoten zu erkennen und dann eine neue Kante einzufügen. Das funktioniert gut. Bis ich eine neue Ansicht hinzugefügt habe, wo der Benutzer gespeicherte Workflows von der Datenbank sehen kann. Das Problem ist, wenn ich die Registerkarte "Ansicht" öffne und dann zur Registerkarte "Erstellung" zurückwechsle, wird die Funktion cy.on('cxttap') zweimal aufgerufen, und zwei Kanten werden in die Cytoscape-Zeichenfläche eingefügt, aber nur ein Eintrag in meiner Bereichsvariablen. Ich hatte früher die gleiche Fabrik für beide Ansichten, aber jetzt benutze ich verschiedene eckige Fabriken für jeden.Cytoscape-Ereignis cxtap mehrmals aufgerufen

Wenn ich zwischen diesen Registerkarten mehrmals öffne, ist die Häufigkeit, mit der ich die Ansichtsregisterkarte öffne, die Anzahl der Aufrufe der Funktion, also mehr die Anzahl der Zeilen.

Hier (https://jsfiddle.net/y47kwpg7/4/) ist das Snippet mit dem Code für beide Ansichten mit ihren Controllern. "Creation View" -> "MlalTextWorkflowGeneratorCtrl" und "Viewing View" -> "MlalTextWorkflowViewerCtrl".

(Bitte verzeihen Sie mir, ich weiß nicht, wie es in einer einzigen Datei arbeiten zu machen)

Die Fabrik ich hier ist für die Cytoscape Leinwand haben, und haben ein ähnliches für eine andere Ansicht, aber mit eine andere ID-Auswahl.

Vielen Dank für Ihre Hilfe!

Antwort

1

@maxkfranz 'Antwort führte mich dazu, ein wenig mehr Debugging zu machen und schließlich habe ich das Problem herausgefunden.

Das Problem war ich hatte einige Listener-Funktionen, die ich von meinem Controller aufgerufen, um Ereignisse auf den Zytoscape-Knoten zu erkennen. Und die zu feuernden Zuhörer wurden in einer variablen workflowGraph.listeners gespeichert. Sie können den alten Code [] 1 sehen. Das Problem war, dass diese Variable nicht geleert wurde, wenn mein Controller neu geladen wurde, weil ich die Listener von meinem Controller anrief, sie wurden zu dieser Variablen noch einmal hinzugefügt. So hatte ein Listener mehrere Funktionen zum Anrufen.

Die Methode, die ich löste, war, eine neue "Listener" -Funktion zu erstellen, die ich früher für Cytoscape-Ereignisse hatte, die ich jedes Mal aufrufen würde, wenn mein Controller geladen wurde, um die Listeners-Variable für meine Cytoscape-Factory zu leeren.

In Cytoscape Fabrik

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

In Controller

workflowCreation ist der Name der Fabrik

workflowCreation.reinitialize(); 

Dies würde einfach die Zuhörer Variable aus der Fabrik leeren.

Denken Sie daran, dies in Ihrem Controller nach der Initialisierung Cytoscape rufen und vor

Hope this jemand hilft jede andere Listener-Funktionen aufrufen.

1

Sie müssen entweder auf

(1) alte Zuhörer entfernen, wenn Sie eine Instanz wiederverwenden oder

(2) Erstellen Sie eine neue Instanz jedes Mal, wenn eine neue Ansicht erstellen.

+0

Ich erstelle eine neue Instanz jedes Mal, wenn ich eine neue Ansicht erstellen, aber das Problem, das ich erkannte, ist, dass die Listener neu geschrieben werden, irgendwelche Eingaben, wie kann ich die alten Listener entfernen, bevor Sie die Ansicht verlassen? –

Verwandte Themen