2015-10-22 1 views
6

ユーザーがドロップダウンから選択し、キャンバスをスキャンするとグラフが変化するというユニークなインシデントが発生しました。私はあなたがgraph.destroy()のようなものを使うことができると知っていますが、それが適切でどこに置くべきかわかりません。私はグラフ グラフタイプを変更するときに前のグラフを表示するChartJsキャンバス

enter image description here

このfiddle

var ctx = document.getElementById("myChart").getContext("2d"); 
    ctx.canvas.width = 600; 
    ctx.canvas.height = 200; 

    function updateChart() { 
     // ctx.canvas.destroy(); 
     var determineChart = $("#chartType").val(); 

     var params = dataMapMain[determineChart]; 
     if ([params.method] == "Pie") { 
      document.getElementById("subOption").hidden = false; 
      document.getElementById("arrowId").hidden = false; 

    var determineChart = $("#subOption").val(); 
      var params = dataMapSub[determineChart]; 
      $('#subOption').on('change', updateChart); 

      new Chart(ctx)[params.method](params.data, options, {}); 

     } 
     else { 
      document.getElementById("subOption").hidden = true; 
      document.getElementById("arrowId").hidden = true; 
      new Chart(ctx)[params.method](params.data, options, {}); 
     } 
    } 

    $('#chartType').on('change', updateChart) 
    updateChart(); 
を更新

コードは、問題を示し、 "ゴースト" を参照してチャート上にマウスを置きます。

+0

問題を示すフィーリングを作成できますか? –

+0

あまりにも人間のライブラリ、表示するGIF添付 – user2402107

答えて

3

Chartのインスタンスを破棄しているわけではないため、chartjsは複数のグラフを同じキャンバスコンテキストに描画しています。

Chartインスタンスの参照を持っている必要があります。newdestroyに電話をかけて、newがもう1つアップしてください。

はあなたのコードにこれを追加します。

var ctx = document.getElementById("myChart").getContext("2d"); 
    ctx.canvas.width = 600; 
    ctx.canvas.height = 200; 

var chart; // assign your chart reference to this variable 

function updateChart() { 
    var determineChart = $("#chartType").val(); 

    var params = dataMapMain[determineChart]; 
    if ([params.method] == "Pie") { 
     document.getElementById("subOption").hidden = false; 
     document.getElementById("arrowId").hidden = false; 

var determineChart = $("#subOption").val(); 
     var params = dataMapSub[determineChart]; 
     $('#subOption').on('change', updateChart); 

     chart && chart.destroy(); // destroy previous chart 
     chart = new Chart(ctx)[params.method](params.data, options, {}); 

    } 
    else { 
     document.getElementById("subOption").hidden = true; 
     document.getElementById("arrowId").hidden = true; 

     chart && chart.destroy(); // destroy previous chart 
     chart = new Chart(ctx)[params.method](params.data, options, {}); 
    } 
} 

$('#chartType').on('change', updateChart) 
updateChart(); 

そして、ここでは修正を実証fiddleです。

+0

あなたの答えは完璧でした!私はしかし、1つの質問があります。私はデータが今Pub/SubモデルのWebsocketを通って来ているので、自動的に数秒ごとに同じチャートタイプのチャートが更新されます。 "Ghost"と同じ問題が発生しました – user2402107

+0

@ user2402107これは更新しても機能しますチャートは数秒ごとに表示されます。新しいものを作成する前に、チャートを破壊することを忘れないでください。この[fiddle](https://jsfiddle.net/AnishPatelUk/75g2bys6/2/)は、データが1秒おきに変更されても動作することを示しています。 –

関連する問題