2015-05-05 19 views
7

Mam następujący kod wykorzystujący bibliotekę ChartJS.Wykres linii ChartJs odmalowuje błąd podczas unoszenia się nad

/*assume the tags in the right place */ 

<canvas id="graph1" width="300" height="300"></canvas> 

var ctx = $("#graph1").get(0).getContext("2d"); 
var myChart = new Chart(ctx).Line(graph1Generator("day")); 

... wszystko działa poprawnie, ale po dodaniu następujące obsługi zdarzeń, aby wyczyścić i pomalować ten sam wykres z różnymi danymi, wystąpi usterka.

weekButton.addEventListener("click", function(){ 
    ctx.clearRect (0, 0, 300, 300); 
    ctx.canvas.width = 300; 
    ctx.canvas.height = 300; 
    myChart = new Chart(ctx).Line(graph1Generator("week")); 

Kod ten jest z powodzeniem przerysować wykres z nowymi danymi, ale kiedy unoszą się nad nim, to jednak pewne bardzo dziwne „retrospekcje” starego wykresu, że miało to wyczyścić. To sprawia, że ​​wierzę, że nie oczyściło starego.

+0

Myślę, że zadziała, jeśli ponownie użyjesz starego obiektu wykresu, zamiast tworzyć nowy w module obsługi zdarzeń. Możesz również wywołać 'myChart.destroy();' tuż przed utworzeniem nowego, jako alternatywę. – Pointy

+0

Jak ponownie wykorzystać stary obiekt wykresu z nowymi danymi? Chociaż wykresy są takie same, mają różne typy danych. Ponadto, 'myChar.destroy();' zdaje się duplikować rozmiar mojego wykresu po każdym zdarzeniu. Dlaczego tak się dzieje? – ApathyBear

+0

Myślę, że po prostu 'myChart.Line (graph1generator (" week "));' (lub cokolwiek, co trzeba zrobić dla nowych danych). Zamiast usuwać płótno za pomocą twojego kodu, niech Chart to zrobi: 'myChart.clear();'. (To może działać lepiej niż '.destroy()'; nie jestem pewien.) – Pointy

Odpowiedz

7

Here is an update to your fiddle. Podstawowa zmiana (inne niż ustalenia nazwa funkcji literówkę) jest dodanie

myChart.destroy(); 

przed liniami jak

myChart = new Chart(ctx).Line(...); 

Sposób .destroy() pozbywa się rejestracjami obsługi zdarzeń itp, więc nie powinieneś widzieć tych dziwnych "wykresów duchów" po najechaniu myszą na grafikę.

+0

Twój jsfiddle działa, ale ma dziwny efekt uboczny. Na skrzypcach inne płótna zaczynają się gwałtownie zwiększać po każdym uruchomieniu programu obsługi zdarzeń. Na mojej stronie (testowanie w safari), wykres liniowy wydaje się tylko wykładniczo większy. Używam Twojego dokładnego kodu, czy jest jakiś sposób, żeby tak się nie stało? – ApathyBear

+0

@ApathyBear Nie widzę niczego, co zwiększa się, gdy go uruchomię. Możesz również dodać wywołania '.destroy()' dla innych wykresów, ale to nie ma większego znaczenia, kiedy go wypróbuję. – Pointy

+0

@ApathyBear Wypróbowałem Firefoksa i Chrome, ale w żadnym przypadku nie zmieniłem rozmiaru wykresów kołowych i pączków. – Pointy