2017-07-09 11 views
0

CytoscapeとAngularJSを使用してネットワークワークフローを作成しようとしています。 2つのノードを作成した後、ユーザーはそれらの間にエッジを作成できます。このため私はcy.on('cxttap')サイトスコープ機能を使用して、両方のノードの右クリックを検出し、新しいエッジを挿入します。 これは正常に動作します。私が新しいビューを追加するまで、ユーザーはデータベースから保存されたワークフローを見ることができます。問題は、表示タブを開いて作成タブに戻ると、cy.on('cxttap')関数が2回呼び出され、2つのエッジがサイトスコープキャンバスに挿入されますが、スコープ変数に1つのエントリしか作成されないということです。私は両方のビューのために同じ工場を持っていましたが、今はそれぞれ別の角度の工場を使用しています。複数回呼び出されたCytoscapeイベントcxttap

これらのタブを複数回開いた場合、表示タブを開く回数は関数が呼び出された回数、つまりより多くの行数になります。

ここで(https://jsfiddle.net/y47kwpg7/4/)は、両方のコントローラを使用した両方のビューのコードを含むスニペットです。 "作成ビュー" - > "MlalTextWorkflowGeneratorCtrl"および "ビューの表示" - > "MlalTextWorkflowViewerCtrl"

私はここにある工場cytoscapeキャンバス用ですが(私を許してください、私はそれが単一のファイルで動作させる方法がわからない)、および他のビューのための同様のものを持っていますが、と異なるIDの選択。

ありがとうございました!

答えて

1

@maxkfranzさんの答えはもう少しデバッグをするように案内しましたが、ついに問題を発見しました。

問題は、サイトスコープノードのイベントを検出するためにコントローラから呼び出されたリスナー機能がいくつかあることでした。そして、呼び出すリスナーは、変数workflowFraphicsListenerに格納されていました。あなたは古いコード[] 1を見ることができます。私のコントローラからリスナーを呼び出していたので、この変数が空にならなかったのは問題でした。コントローラからリスナーを呼び出すと、再びこの変数に追加されていました。そのため、1人のリスナーが複数の機能を呼び出すことができました。

私がこれを解決するために使用した方法は、私がcytoscapeイベントのために以前持っていた新しい "リスナ"型関数を作成することでした。

cytoscape工場で

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

コントローラで

workflowCreationこれは単に工場から可変リスナーを空になる工場

workflowCreation.reinitialize(); 

の名前です。

はcytoscape初期化した後、他のリスナーを呼び出す前に、あなたのコントローラでこれを呼び出すことを忘れないでください

が、これは誰かのお役に立てば幸いです機能。

1

あなたはどちらかの新しいインスタンスに新しいビューを作成するたびに作成する(2)あなたは、インスタンスを再使用している場合(1)古いリスナーを削除し、または

する必要があります。

+0

私は新しいビューを作成するたびに新しいインスタンスを作成していますが、私が認識している問題は、リスナーが読み込まれていることです。入力からビューを離れる前に古いリスナーを削除するにはどうすればよいですか? –

関連する問題