2011-11-24 29 views
25

Tôi đang có nhiều biểu đồ highchart thuộc nhiều loại khác nhau (Bar, Pie, Scatter type) trong một trang web duy nhất. Hiện tại tôi đang tạo đối tượng cấu hình cho mỗi đồ thị như,Quản lý nhiều biểu đồ highchart trong một trang web duy nhất

{ 
chart : {}, 
blah blah, 
} 

Và cho chúng vào chức năng tùy chỉnh sẽ chỉ gọi HighCharts.chart(). Nhưng điều này dẫn đến trùng lặp mã. Tôi muốn quản lý tất cả các biểu đồ này hiển thị logic tập trung.

Bất kỳ ý tưởng nào về cách thực hiện việc này?

+1

Chính xác thì vấn đề là gì? Sao chép mã ở đâu? Cung cấp mã của bạn. – NT3RP

Trả lời

39

Bạn có thể sử dụng jQuery.extend()Highcharts.setOptions.
Vì vậy, trước tiên bạn sẽ tạo đối tượng đầu tiên sẽ được mở rộng bởi tất cả các biểu đồ của bạn, đối tượng này sẽ chứa các hàm mặc định Highchart của bạn.

Bạn có thể thực hiện việc này bằng cách sử dụng đặt tên không gian.
Cách sau đây là tốt khi bạn có các biểu đồ rất khác nhau.

Mặc đồ họa:

var defaultChart = { 
    chartContent: null, 
    highchart: null, 
    defaults: { 

     chart: { 
      alignTicks: false, 
      borderColor: '#656565', 
      borderWidth: 1, 
      zoomType: 'x', 
      height: 400, 
      width: 800 
     }, 

     series: [] 

    }, 

    // here you'll merge the defauls with the object options 

    init: function(options) { 

     this.highchart= jQuery.extend({}, this.defaults, options); 
     this.highchart.chart.renderTo = this.chartContent; 
    }, 

    create: function() { 

     new Highcharts.Chart(this.highchart); 
    } 

}; 

Bây giờ, nếu bạn muốn thực hiện một biểu đồ cột, bạn sẽ mở rộng defaultChart

var columnChart = { 

    chartContent: '#yourChartContent', 
    options: { 

     // your chart options 
    } 

}; 

columnChart = jQuery.extend(true, {}, defaultChart, columnChart); 

// now columnChart has all defaultChart functions 

// now you'll init the object with your chart options 

columnChart.init(columnChart.options); 

// when you want to create the chart you just call 

columnChart.create(); 

Nếu bạn có bảng xếp hạng tương tự như sử dụng Highcharts.setOptions mà sẽ áp dụng tùy chọn cho tất cả các biểu đồ đã tạo sau này.

// `options` will be used by all charts 
Highcharts.setOptions(options); 

// only data options 
var chart1 = Highcharts.Chart({ 
    chart: { 
     renderTo: 'container1' 
    }, 
    series: [] 
}); 

var chart2 = Highcharts.Chart({ 
    chart: { 
     renderTo: 'container2' 
    }, 
    series: [] 
}); 

Reference

COMPLETE DEMO

+0

Cảm ơn bạn đã trả lời! –

+4

Điều này thật tuyệt! Chỉ cần đi qua mã này ngày hôm qua và nó rất hữu ích.Một điểm tôi muốn làm là bạn không nên sử dụng thẻ bắt đầu bằng # khi khai báo chartContent, nếu không Highcharts sẽ ném một lỗi (13). – WastedSpace

+0

Tôi có tình huống tương tự nhưng với Highstock. +1 cho ý tưởng –

4

Để thêm vào @ câu trả lời tuyệt vời của Ricardo, tôi cũng đã làm một cái gì đó rất giống nhau. Trong thực tế, tôi sẽ không sai nếu tôi nói rằng tôi đã đi một bước xa hơn này. Do đó, muốn chia sẻ cách tiếp cận này.

Tôi đã tạo một trình bao bọc trên thư viện highchart. Điều này cho phép nhiều lợi ích, sau là những ưu điểm chính khuyến khích đi theo con đường này

  • tách: tách riêng mã của bạn từ highcharts
  • Nâng cấp
  • dễ dàng: wrapper Đây sẽ là mã duy nhất mà sẽ yêu cầu sửa đổi trong trường hợp có bất kỳ thay đổi đột phá nào trong apch highchart sau khi nâng cấp hoặc thậm chí nếu bạn quyết định chuyển sang thư viện biểu đồ differnt (thậm chí từ highchart đến highstock có thể đầy đủ nếu ứng dụng của bạn sử dụng biểu đồ rộng rãi)
  • Dễ sử dụng: api bao bọc được giữ rất đơn giản, chỉ những thứ có thể thay đổi được hiển thị dưới dạng tùy chọn (Điều đó cũng có giá trị không phải là đối tượng js sâu như HC đã có, chủ yếu là 1 cấp độ sâu), mỗi giá trị mặc định.Vì vậy, hầu hết thời gian tạo biểu đồ của chúng tôi là rất ngắn, với các nhà xây dựng lấy 1 options đối tượng với chỉ 4-5 thuộc tính có giá trị mặc định không phù hợp với biểu đồ dưới tạo
  • Phù UX: nhìn Phù & cảm thấy trên ứng dụng . ví dụ: định dạng đầu công cụ & vị trí, màu sắc, họ phông chữ, màu sắc, nút thanh công cụ (xuất), v.v.
  • Tránh trùng lặp: Tất nhiên là câu trả lời hợp lệ của câu hỏi được hỏi phải tránh trùng lặp và thực hiện một mức độ lớn

Dưới đây là những gì các options trông giống như với các giá trị mặc định của họ

defaults : { 
     chartType : "line", 
     startTime : 0, 
     interval : 1000, 
     chartData : [], 
     title : "Product Name", 
     navigator : true, 
     legends : true, 
     presetTimeRanges : [], 
     primaryToolbarButtons : true, 
     secondaryToolbarButtons : true, 
     zoomX : true, 
     zoomY : false, 
     height : null, 
     width : null, 
     panning : false, 
     reflow : false, 
     yDecimals : 2, 
     container : "container", 
     allowFullScreen : true, 
     credits : false, 
     showAll : false, 
     fontSize : "normal", // other option available is "small" 
     showBtnsInNewTab : false, 
     xAxisTitle : null, 
     yAxisTitle : null, 
     onLoad : null, 
     pointMarkers : false, 
     categories : [] 
} 

như bạn có thể thấy, hầu hết các lần, chỉ chartData rằng những thay đổi của nó. Thậm chí nếu bạn cần thiết lập một số thuộc tính, chủ yếu là các loại true/false, không giống như kinh dị mà hàm tạo highchart mong đợi (không phê bình chúng, số lượng tùy chọn mà chúng cung cấp chỉ là tuyệt vời từ điểm tùy chỉnh, nhưng đối với mọi nhà phát triển nhóm nghiên cứu để hiểu & chủ nó có thể mất một thời gian)

vì vậy, tạo ra các biểu đồ đơn giản như

var chart=new myLib.Chart({ 
       chartData : [[1000000,1],[2000000,2],[3000000,1],[4000000,5]] 
     }); 
6

tôi biết điều này đã được trả lời, nhưng tôi cảm thấy rằng nó có thể được thực hiện chưa thêm. Tôi vẫn còn mới với JavaScript và jQuery, vì vậy nếu bất cứ ai tìm thấy bất cứ điều gì sai, hoặc nghĩ rằng cách tiếp cận này phá vỡ các nguyên tắc hoặc quy tắc của ngón tay cái của một số loại, tôi sẽ biết ơn thông tin phản hồi.

Xây dựng trên nguyên tắc được Ricardo Lohmann mô tả, tôi đã tạo một plugin jQuery, theo ý kiến ​​của tôi cho phép Highcharts hoạt động liền mạch hơn với jQuery (tức là cách jQuery làm việc với các đối tượng HTML khác).

Tôi chưa bao giờ thích thực tế là bạn phải cung cấp ID đối tượng cho Highcharts trước khi nó vẽ biểu đồ. Vì vậy, với trình cắm thêm, tôi có thể gán biểu đồ cho đối tượng bộ chọn jQuery chuẩn, mà không cần phải cung cấp giá trị <div> chứa id.

(function($){ 
    var chartType = { 
     myArea : { 
      chart: { type: 'area' }, 
      title: { text: 'Example Line Chart' }, 
      xAxis: { /* xAxis settings... */ }, 
      yAxis: { /* yAxis settings... */ }, 
      /* etc. */ 
      series: [] 
     }, 
     myColumn : { 
      chart: { type: 'column' }, 
      title: { text: 'Example Column Chart' }, 
      xAxis: { /* xAxis settings... */ }, 
      yAxis: { /* yAxis settings... */ }, 
      /* etc. */ 
      series: [] 
     } 
    }; 
    var methods = { 
     init: 
      function (chartName, options) { 
       return this.each(function(i) { 
        optsThis = options[i]; 
        chartType[chartName].chart.renderTo = this; 
        optsHighchart = $.extend (true, {}, chartType[chartName], optsThis); 
        new Highcharts.Chart (optsHighchart); 
       }); 
      } 
    }; 
    $.fn.cbhChart = function (action,objSettings) { 
     if (chartType[action]) { 
      return methods.init.apply(this, arguments); 
     } else if (methods[action]) { 
      return methods[method].apply(this,Array.prototype.slice.call(arguments,1)); 
     } else if (typeof action === 'object' || !action) { 
      $.error('Invalid arguments to plugin: jQuery.cbhChart'); 
     } else { 
      $.error('Action "' + action + '" does not exist on jQuery.cbhChart'); 
     } 
    }; 
})(jQuery); 

Với plug-in này, tôi bây giờ có thể gán một biểu đồ như sau:

$('.columnChart').cbhChart('myColumn', optionsArray); 

Đây là một ví dụ đơn giản dĩ nhiên; cho một ví dụ thực tế, bạn phải tạo các thuộc tính biểu đồ phức tạp hơn. Nhưng đó là các nguyên tắc liên quan đến chúng tôi ở đây và tôi thấy rằng cách tiếp cận này giải quyết câu hỏi ban đầu. Nó tái sử dụng mã, trong khi vẫn cho phép thay đổi biểu đồ riêng lẻ được áp dụng dần dần trên đầu trang của mỗi khác.

Về nguyên tắc, nó cũng cho phép bạn nhóm nhiều cuộc gọi Ajax lại với nhau thành một, đẩy các tùy chọn và dữ liệu của từng đồ thị vào một mảng JavaScript duy nhất.

Các buộc dụ jFiddle là ở đây: http://jsfiddle.net/3GYHg/1/

trích hoan nghênh !!

+0

Bỏ phiếu của tôi cho câu trả lời hay nhất. Làm tốt lắm. – crashtestxxx

Các vấn đề liên quan