2014-01-21 50 views
1

我有一個HighCharts線圖,允許多點選擇。在每次選擇/取消選擇後,我想根據當前選定的所有點執行操作。HighCharts多點選擇 - 在點選擇後立即訪問/更新getSelectedPoints數組

我觸發了plotoptions.line.point.events.select(或.click)事件,它返回所選的最新點。但是,chart.getSelectedPoints()返回的數組顯然不會在.select或.click事件完成之後纔會更新。所以我不能在裏面使用chart.getSelectedPoints()這個事件。

下面是從這個例子表明該問題的exerpt - http://jsfiddle.net/joelion/QJ75h/

plotOptions: { 
     series: { 
      allowPointSelect: true, 
      point: { 
       events: { 
        select: function() { 
         var chart = $('#container').highcharts(); 

         var selectedPointsStr = ""; 

         // when is the chart object updated? after this function finshes? 
         var selectedPoints = chart.getSelectedPoints(); 
         $.each(selectedPoints, function(i, value) { 
          selectedPointsStr += "<br>"+value.category; 
         }); 

         $report.html(selectedPointsStr);        
        } 
       } 
      } 
     } 

有沒有辦法迫使圖表getSelectedPoints()陣列後點選擇?或者可能是陣列更新後觸發的另一個事件?

回答

0

您可以使用選定的點創建數組,只需按/覆蓋裏面的點。演示:http://jsfiddle.net/QJ75h/2/

var $report = $('#report'), 
    selectedPoints = []; 

// create the chart 
$('#container').highcharts({ 
    chart: {}, 
    xAxis: { 
     categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] 
    }, 

    plotOptions: { 
     series: { 
      allowPointSelect: true, 
      point: { 
       events: { 
        select: function (event) { 
         var chart = this.series.chart; 

         var selectedPointsStr = ""; 
         if (event.accumulate) { 
          selectedPoints.push(this); 
         } else { 
          selectedPoints = [this]; 
         } 
         $.each(selectedPoints, function (i, value) { 
          selectedPointsStr += "<br>" + value.category; 
         }); 
         $report.html(selectedPointsStr); 
        } 
       } 
      } 
     } 
    }, 

    series: [{ 
     data: [29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4] 
    }] 
}); 
+0

這幾乎就是我在發佈後不久就實施的內容。 但是,我結束了與另一種解決方案。我這樣做的原因是,當用戶點擊一個點時,第二個圖表的數據會動態加載並繪製在第二個圖表上。但是我發現,在進行多點選擇時,第二個圖形在每次點擊之後都會重新繪製,速度很慢且讓人分心。所以我剛剛添加了一個按鈕來強制繪製第二個圖表,在第一個圖表中選擇點之後。按鈕功能可以使用普通的getSelectedPoints()函數。 – joelion

+0

是的,的確如此。那麼好工作! –

0

如果選擇chart.getSelectedPoints()回報所有其他分和select回調this是剛剛選定的一點,爲什麼不將它們結合起來,以獲得所有被選中的點?

select: function() { 
    var chart = $('#container').highcharts(); 

    // when is the chart object updated? after this function finshes? 
    var selectedPoints = chart.getSelectedPoints(); 
    selectedPoints.push(this); // now it's got all the points! 

    var selectedPointsStr = ""; 
    $.each(selectedPoints, function(i, value) { 
     selectedPointsStr += "<br>"+value.category; 
    }); 

    $report.html(selectedPointsStr);        
} 

小提琴here

或者,你可以採取一點行動setTimeout

select: function() { 

    setTimeout(function(){ 

     var chart = $('#container').highcharts(); 

     // when is the chart object updated? after this function finshes? 
     var selectedPoints = chart.getSelectedPoints(); 

     var selectedPointsStr = ""; 
     $.each(selectedPoints, function(i, value) { 
      selectedPointsStr += "<br>"+value.category; 
     }); 

     $report.html(selectedPointsStr);        
    }, 100); 
} 

另一個fiddle

+0

我幾乎實現了您的第一個選項(請參閱對PawełFus的響應)。我也曾想過你的第二個解決方案,但並不認爲它會起作用。我認爲getSelectedPoints()不起作用的原因不是因爲計時,而是因爲它在「select」或「click」事件之後才實際更新。 100ms的超時時間似乎有效,但它有點冒險,而且我不願意依靠超時來控制陣列更新的時間。無論如何,我結束了一個異步方案,我使用了一個調用getSelectedPoints()的單獨按鈕。 – joelion