Ich verwende Chartjs, um ein Liniendiagramm anzuzeigen, und dies funktioniert einwandfrei:
// get line chart canvas
var targetCanvas = document.getElementById('chartCanvas').getContext('2d');
// draw line chart
var chart = new Chart(targetCanvas).Line(chartData);
Das Problem tritt jedoch auf, wenn ich versuche, die Daten für das Diagramm zu ändern. Ich aktualisiere das Diagramm, indem ich eine neue Instanz eines Diagramms mit den neuen Datenpunkten erstelle und so die Zeichenfläche neu initialisiere.
Das funktioniert gut. Wenn ich jedoch mit der Maus über das neue Diagramm schwebe und über bestimmte Positionen gehe, die den auf dem alten Diagramm angezeigten Punkten entsprechen, wird der Schwebeflug / die Beschriftung weiterhin ausgelöst und plötzlich ist das alte Diagramm sichtbar. Es bleibt sichtbar, während sich meine Maus an dieser Stelle befindet, und verschwindet, wenn Sie diesen Punkt verlassen. Ich möchte nicht, dass das alte Diagramm angezeigt wird. Ich möchte es komplett entfernen.
Ich habe versucht, sowohl die Leinwand als auch das vorhandene Diagramm zu löschen, bevor ich das neue lade. Mögen:
targetCanvas.clearRect(0,0, targetCanvas.canvas.width, targetCanvas.canvas.height);
und
chart.clear();
Aber keines davon hat bisher funktioniert. Irgendwelche Ideen, wie ich das verhindern kann?
quelle
Antworten:
Ich hatte große Probleme damit
Zuerst habe ich es versucht,
.clear()
dann habe ich es versucht.destroy()
und ich habe versucht, meine Diagrammreferenz auf null zu setzenWas das Problem für mich endgültig behoben hat: Löschen des
<canvas>
Elements und erneutes Anhängen eines neuen Elements<canvas>
an den übergeordneten ContainerMein spezifischer Code (offensichtlich gibt es dafür eine Million Möglichkeiten):
quelle
$('#results-graph').remove(); $('#graph-container').append('<canvas id="results-graph"><canvas>');
vor demnew Chart(document.getElementById("myCanvas")
Ich habe vor einigen Stunden das gleiche Problem gehabt.
Die Methode ".clear ()" löscht tatsächlich die Leinwand, lässt das Objekt jedoch (offensichtlich) lebendig und reaktiv.
Beim sorgfältigen Lesen der offiziellen Dokumentation im Abschnitt "Erweiterte Verwendung" ist mir die Methode ".destroy ()" aufgefallen, die wie folgt beschrieben wird:
Es macht tatsächlich das, was es behauptet und es hat gut für mich funktioniert. Ich schlage vor, dass Sie es versuchen.
quelle
quelle
Dies ist das einzige, was für mich funktioniert hat:
quelle
Ich hatte hier das gleiche Problem ... Ich habe versucht, die Methode destroy () und clear () zu verwenden, aber ohne Erfolg.
Ich habe es auf die nächste Weise gelöst:
HTML:
Javascript:
Es funktioniert perfekt für mich ... Ich hoffe, dass es hilft.
quelle
Das hat bei mir sehr gut funktioniert
Verwenden Sie .destroy , um alle erstellten Diagramminstanzen zu zerstören. Dadurch werden alle Verweise auf das Diagrammobjekt in Chart.js sowie alle zugehörigen Ereignis-Listener bereinigt, die von Chart.js angehängt werden. Dies muss aufgerufen werden, bevor die Zeichenfläche für ein neues Diagramm wiederverwendet wird.
quelle
Wir können die Diagrammdaten in Chart.js V2.0 wie folgt aktualisieren:
quelle
Mit CanvasJS funktioniert dies für mich, wenn ich Diagramme lösche, und alles andere funktioniert möglicherweise auch für Sie, sodass Sie Ihre Zeichenfläche / Ihr Diagramm vor jeder Verarbeitung an anderer Stelle vollständig einrichten können:
quelle
Ich konnte .destroy () auch nicht zum Arbeiten bringen, also mache ich das so. In der Datei chart_parent div soll die Zeichenfläche angezeigt werden. Ich brauche die Größe der Leinwand jedes Mal, daher ist diese Antwort eine Erweiterung der obigen.
HTML:
<div class="main_section" > <div id="chart_parent"></div> <div id="legend"></div> </div>
JQuery:
quelle
Wenn Sie eine neue chart.js-Zeichenfläche erstellen, wird ein neuer versteckter Iframe generiert. Sie müssen die Zeichenfläche und die alten iframes löschen.
Referenz: https://github.com/zebus3d/javascript/blob/master/chartJS_filtering_with_checkboxs.html
quelle
Das hat bei mir funktioniert. Fügen Sie clearChart oben in Ihrem updateChart () einen Aufruf hinzu.
quelle
Wenn Sie chart.js in einem Angular-Projekt mit Typescript verwenden, können Sie Folgendes versuchen:
quelle
Was wir getan haben, ist, vor der Initialisierung eines neuen Diagramms die Vorschau-Diagramminstanz zu entfernen / zu zerstören, falls bereits vorhanden, und dann beispielsweise ein neues Diagramm zu erstellen
Hoffe das hilft.
quelle
Adams Antwort ergänzen
Mit Vanilla JS:
quelle
Einfache Bearbeitung für 2020:
Das hat bei mir funktioniert. Ändern Sie das Diagramm in global, indem Sie es als Fenster-Eigentümer festlegen (Ändern Sie die Deklaration von
var myChart
inwindow myChart
).Überprüfen Sie, ob die Diagrammvariable bereits als Diagramm initialisiert ist. Wenn ja, zerstören Sie sie und erstellen Sie eine neue. Sie können auch eine andere mit demselben Namen erstellen. Unten ist der Code:
Hoffe, es funktioniert!
quelle
Bei mir hat das geklappt:
quelle
Chart.js hat einen Fehler:
Chart.controller(instance)
Registriert jedes neue Diagramm in einer globalen EigenschaftChart.instances[]
und löscht es aus dieser Eigenschaft am.destroy()
.Bei der Diagrammerstellung schreibt Chart.js jedoch auch
._meta
Eigenschaften in die Dataset-Variable:und es löscht diese Eigenschaft nicht auf
destroy()
.Wenn Sie Ihr altes Dataset-Objekt verwenden, ohne es zu entfernen
._meta property
, fügt Chart.js ein neues Dataset hinzu,._meta
ohne vorherige Daten zu löschen . Somit sammelt Ihr Datensatzobjekt bei der Neuinitialisierung jedes Diagramms alle vorherigen Daten.Um dies zu vermeiden, zerstören Sie das Dataset-Objekt nach dem Aufruf
Chart.destroy()
.quelle
Da "zerstören" "alles" zerstört, ist eine billige und einfache Lösung, wenn Sie wirklich nur "die Daten zurücksetzen" möchten. Das Zurücksetzen Ihrer Datensätze auf ein leeres Array funktioniert ebenfalls einwandfrei. Wenn Sie also einen Datensatz mit Beschriftungen und einer Achse auf jeder Seite haben:
Danach können Sie einfach anrufen:
oder, je nachdem, ob Sie einen 2D-Datensatz verwenden:
Es ist viel leichter, als Ihr gesamtes Diagramm / Ihren gesamten Datensatz vollständig zu zerstören und alles neu zu erstellen.
quelle
Für diejenigen, die wie ich eine Funktion verwenden, um mehrere Grafiken zu erstellen und sie auch einen Block zu aktualisieren, nur die Funktion .destroy () hat für mich funktioniert, hätte ich gerne eine .update () erstellt, die sauberer erscheint, aber .. Hier ist ein Code-Snippet, das helfen kann.
quelle