2013-12-12 4 views
0

이 js 함수를 사용하여 하이 차트 차트에서 CSV를 내보내고 있습니다. 나는 이미 Highcharts (3.0.7)의 최신 버전을 사용하고있다. CSV가 올바르게 내보내집니다.이 코드의 문제점은 3D 차트를 내 보낸 후 X 축을 Highcharts 자바 스크립트 개체가 변경된 것처럼 수정되는 경우가있는 경우입니다. 그러나 아래의 코드는 실제 Highcharts 객체를 만지지는 않습니다 (적어도 이것이 내가 생각하는 것입니다).하이 차트 CSV 내보내기가 차트 JS 객체를 변경합니다.

if (xAxis.categories) { 
    columns.push(xAxis.categories); 
    columns[0].unshift(""); 
} 

수출 후 업데이트 할 x 축 방지, 그러나 동시에 이것은 분명히 내 보낸 CSV를 나누기 :

는 몇 가지 테스트 후,이 경우 블록을 주석하는 것을 발견했다.

어떻게 가능합니까?

(function (Highcharts) { 

    // Options 
    var itemDelimiter = ';', // use ';' for direct import to Excel 
     lineDelimiter = '\n'; 

    var each = Highcharts.each; 
    Highcharts.Chart.prototype.getCSV = function() { 
     var xAxis = this.options.xAxis[0], 
      columns = [], 
      line, 
      csv = "", 
      row, 
      col; 

     if (xAxis.categories) { 
      columns.push(xAxis.categories); 
      columns[0].unshift(""); 
     } 

     each(this.series, function (v){ 
      columns.push(v.yData); 
      columns[columns.length - 1].unshift(v.name); 
     }); 

     // Transform the columns to CSV 
     for (row = 0; row < columns[0].length; row++) { 
      line = []; 
      for (col = 0; col < columns.length; col++) { 
       line.push(columns[col][row]); 
      } 
      csv += line.join(itemDelimiter) + lineDelimiter; 
     } 
     return csv; 
    }; 

    // Now we want to add "Download CSV" to the exporting menu. We post the CSV 
    // to a simple PHP script that returns it with a content-type header as a 
    // downloadable file. 
    // The source code for the PHP script can be viewed at 
    // https://raw.github.com/highslide-software/highcharts.com/master/studies/csv-export/csv.php 

    Highcharts.getOptions().exporting.buttons.contextButton.menuItems.push({ 
     text: 'Download CSV', 
     onclick: function() { 
      Highcharts.post('http://www.highcharts.com/studies/csv-export/csv.php', { 
       csv: this.getCSV() 
      }); 
     } 
    }); 
}(Highcharts)); 

은 몇 가지 조사 후, 나는이 "이상한"행동이 코드 줄에 위치 일어난 진짜 이유가 있음을 발견 :

var xAxis = this.options.xAxis[0]; 

내가 인식하지 않았다 새로운 VAR의 x 축 실제 Highcharts 객체에 대해 "포인터와 비슷하게"취급되므로 값을 변경하거나 변경하지 않으면 원본 객체도 수정됩니다. 이 동작 ('참조로 전달'과 유사 함)은 객체에서만 발생하며 이는 실제로 저를 오도합니다. 이 경우 JavaScript가 실제로 부적절합니다.

답변

1

문제는 아마도 다음과 같습니다. columns[0].unshift("");은 원래 카테고리를 수정하고 있습니다.

해결책? 카테고리 사본을 사용하십시오 (예 :

).
if (xAxis.categories) { 
     var c = $.merge([''], xAxis.categories); 
     columns.push(c); 
    } 

이 경우 도움이되지 않는 경우 jsFiddle에서 문제를 다시 작성하십시오.

+0

이것은 분명히 효과가 있습니다. 이유를 설명하지 않았더라도 그것은 올바른 방향으로 나아갔습니다. –

+0

unshift 함수는 배열에 항목을 추가하기 때문에 원본 객체를 조작 할 때 새 범주를 추가하면 원래 차트에 문제가 발생할 수 있습니다. –

+0

예, 개체 참조가 새 xAxis 변수에 값으로 전달되었다는 것을 알지 못했기 때문에 원본 개체에서 작동하는 것으로 생각하지 않았습니다 ... 감사합니다. +1 –

관련 문제