2017-09-26 35 views
2

Ich erweitere mxgraph delete Steuerelement example zu löschen wie Steuerelemente zu Knoten hinzufügen, die dynamisch in meinem Diagramm generiert werden. Der Quellcode für das Beispiel verfügbar ist heremxgraph Endlosschleifen anwenden

Das Problem ist in diesem Teil des Codes -

  // Overridden to add an additional control to the state at creation time 
      mxCellRendererCreateControl = mxCellRenderer.prototype.createControl; 
      mxCellRenderer.prototype.createControl = function(state) 
      { 
       mxCellRendererCreateControl.apply(this, arguments); 

       var graph = state.view.graph; 

       if (graph.getModel().isVertex(state.cell)) 
       { 
        if (state.deleteControl == null) 

mxCellRendererCreateControl.apply innerhalb des überschriebenen Rückruf von create scheint wie beabsichtigt zu arbeiten (ruft die Originalfunktion vor dem Erstellen zusätzlicher Kontrollen) mit dem Ausgangszustand des Graphen beim Laden. Aber sobald ich Knoten dynamisch zum Graphen hinzufüge und der Callback von mxgraphs validate/redraw aufgerufen wird, geht das Steuerelement in eine Endlosschleife über, wobei die 'apply' -Funktion sich grundsätzlich selbst aufruft (d. H. Der Callback).

Ich bin ein bisschen ratlos, weil, wenn ich debugge, der Kontext (das) sieht gut aus, aber ich kann nicht herausfinden, warum anstelle des Aufrufs der Prototyp-Methode, ruft nur die überschriebene Funktion in einer Schleife. Was mache ich falsch?

+0

Können Sie erarbeiten, was 'mxCellRendererCreateControl' ist und warum Sie überschreiben und verwenden 'Prototyp'? –

+0

Ist es möglich, ein minimales Online-Beispiel zu erstellen? –

+0

@GhassenLouhaichi mxCellRendererCreateControl ist die createControl-Methode in mxCellRenderer.js. Sie können die Quelle hier sehen - https://github.com/jgraph/mxgraph/blob/master/javascript/src/js/view/mxCellRenderer.js, Zeile 600. Es erstellt das grundlegende Rechteck/Shape, das Sie wollen zuerst anzeigen, bevor Sie über die Form zeichnen und ein Löschsteuerelement hinzufügen. Warum ich es übertreibe, das ist nur der empfohlene Weg, es in mxgraph zu tun. Sie können dies im ersten Beispiel-Link sehen, der auf diesem Beitrag gepostet wird. Über den Knoten können Sie Löschsymbole sehen. Diese werden durch Überschreiben gezeichnet. – Jay

Antwort

1

Es sieht aus wie Sie nicht Ihre ursprüngliche Funktion der richtige Weg, das Klonen, versuchen Sie bitte folgendes:

Function.prototype.clone = function() { 
    var that = this; 
    return function theClone() { 
     return that.apply(this, arguments); 
    }; 
}; 

dass neue Methode hinzufügen irgendwo in Ihrem Haupt-Code, so dass es in der gesamten Anwendung zur Verfügung, werden Sie jetzt ändern kann Ihren Code:

// Overridden to add an additional control to the state at creation time 
let mxCellRendererCreateControl = mxCellRenderer.prototype.createControl.clone(); 
mxCellRenderer.prototype.createControl = function(state) { 
    mxCellRendererCreateControl(state); 

    var graph = state.view.graph; 
    if (graph.getModel().isVertex(state.cell)) { 
     if (state.deleteControl == null) { 
      // ... 
     } 
    } 
    // ... 
}; 

Dies sollte funktionieren, wenn ich das richtig das Problem zu verstehen, wenn es nicht, bitte den alten Funktionsaufruf zurück zum apply ändern. Ansonsten lassen Sie mich wissen, ob etwas anderes passiert ist nach der Function Prototyp-Änderung.

+0

Danke für die Antwort. Ich habe es versucht, aber es hat das Problem nicht gelöst. – Jay

+0

Hat sich etwas geändert? Oder das Gleiche ist passiert? –

+0

Nichts hat sich geändert. gleiches Ergebnis. – Jay

1

Es scheint, dass Ihr überwiegendes Code wird mehrmals aufgerufen werden (das Hinzufügen einer einfachen console.log vor Ihrem vorrangigen Code genug sein sollte, um dies zu testen)

Versuche, dass der Code, um sicherzustellen, dass die Funktion überschreibt nur einmal aufgerufen wird, oder überprüfen Sie, ob die Prototyp-Funktion das Original oder Ihr ist.

Hier ist ein Beispiel dafür, wie Sie überprüfen können, ob die Funktion Sie ist oder nicht

if (!mxCellRenderer.prototype.createControl.isOverridenByMe) { 
    let mxCellRendererCreateControl = mxCellRenderer.prototype.createControl; 
    mxCellRenderer.prototype.createControl = function(state) { /* ... */ }; 
    mxCellRenderer.prototype.createControl.isOverridenByMe = true; 
} 

Es gibt andere Möglichkeiten, wie eine globale Variable zu überprüfen, ob Sie die Methode außer Kraft gesetzt haben oder nicht.

Wenn dies Ihr Problem nicht beheben, wenden Sie sich bitte mehr über den Rest des Codes schreiben (wie dieser Code geladen wird/genannt viel helfen würde)

+0

Vielen Dank, dass Sie sich die Zeit genommen haben, diese Frage zu beantworten. Schätze deine Hilfe. – Jay

Verwandte Themen