2012-07-18 1 views
0

У меня есть следующие настройки:переключая DataTable строк на основе HighChart Легенда

HighChart Graph 
-------------------- 

DataTable Header 
Month    | Day  | Total | etc 
---------------------------------------- 
June    |  2  | 10  | ... 
June    |  5  | 20  | ... 
July    | 29  | 10  | ... 
Aug    |  1  | 30  | ... 

серии на моем графике озаглавлены как месяцы.

То, что я хотел сделать, - когда легенда будет переключена, она скроет строки, которые MATCH нажимают на серию.

Вопрос в том, как вы интегрируете обратные вызовы HighChart с фильтрами DataTables?

ответ

1

В этом ответе я предполагаю, что переменная dataTable равна таковой объекта DataTable.

Во-первых,

Позволяет настроить функцию обратного вызова от Highcharts.

... 
plotOptions: { 
    spline: { 
     events: { 
      legendItemClick: function() { 
       // Filters Go Here 
      } 
     }, 
     showInLegend: true 
    } 
} 
... 

Во-вторых,

Мы собираемся принять этот шаг дальше и добавить определить, когда серии переключены:

filters = []; // Set this inside your $(document).ready(function(e) { 
... 
plotOptions: { 
    spline: { 
     events: { 
      legendItemClick: function() { 
       tmp = []; 

       // Series was Visible, Now Hidden 
       if(this.visible){ 
        // Add Action Here 
       } 
       // Series was Hidden, Now Visible 
       else{ 
        // Add Action Here 
       } 
      } 
     }, 
     showInLegend: true 
    } 
} 
... 

В-третьих,

Теперь мы знаем, когда серия была переключена. Мы можем обнаружить, из какого состояния они пришли и из какого состояния они идут. Мы не собираемся настраивать фильтры для DataTables.

filters = []; // Set this inside your $(document).ready(function(e) { 
... 
plotOptions: { 
    spline: { 
     events: { 
      legendItemClick: function() { 
       tmp = []; 

       // Series was Visible, Now Hidden 
       if(this.visible){ 
        filter.push(this.name); 
       } 

       // Series was Hidden, Now Visible 
       else{ 
        var series = this.name; 
        $.each(filter, function(k, v){ 
         if(v != series){ 
          tmp.push(v); 
         } 
        }); 

        filter = tmp; 
       } 
      } 
     }, 
     showInLegend: true 
    } 
} 
... 

Наконец,

Теперь у нас есть filter массив, заполненный именами series от Highcharts Legend. Нам нужно взять этот массив и применить его к фильтру.

filters = []; // Set this inside your $(document).ready(function(e) { 
... 
plotOptions: { 
    spline: { 
     events: { 
      legendItemClick: function() { 
        tmp = []; 

       // Series was Visible, Now Hidden 
       if(this.visible){ 
        filter.push(this.name); 
       } 

       // Series was Hidden, Now Visible 
       else{ 
        var series = this.name; 
        $.each(filter, function(k, v){ 
         if(v != series){ 
          tmp.push(v); 
         } 
        }); 

        filter = tmp; 
       } 

       regex = (filter.length > 0 ? '^((?!('+filter.join('|')+')).)*$' : ""); 

       dataTable.fnFilter(
        regex, 
        0, // set this to your column index 
        true 
       ); 
      } 
     }, 
     showInLegend: true 
    } 
} 
... 

Done!

регулярного выражения, используемые выше, ^((?!('+filter.join('|')+')).)*$ выступит отрицательный смотреть вперед с Implode из массива filter с | (труба) характера, как клей для OR.

1

Вы можете применить следующие на обратный вызов .. я думаю ..

$.each(chart.options.series, function(key, value){ 
    // filter here 
}