Управление несколькими диаграммами старших диаграмм на одной веб-странице - PullRequest
26 голосов
/ 24 ноября 2011

У меня есть несколько высокоточных диаграмм различных типов (гистограмма, круговая диаграмма, тип разброса) на одной веб-странице. В настоящее время я создаю объект конфигурации для каждого графика, например,

{
chart : {},
blah blah,
}

И подача их к пользовательской функции, которая будет просто вызывать HighCharts.chart(). Но это приводит к дублированию кода. Я хочу централизованно управлять всей логикой рендеринга графиков.

Есть идеи, как это сделать?

Ответы [ 3 ]

41 голосов
/ 07 марта 2012

Вы можете использовать jQuery.extend() и Highcharts.setOptions.
Итак, сначала вы создадите первый объект, который будет расширен всеми вашими диаграммами, этот объект будет содержать ваши стандартные функции Highchart.

Вы можете сделать это, используя пространство имен.
Следующий способ хорош, когда у вас очень разные графики.

Графика по умолчанию:

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);
    }

};

Теперь, если вы хотите создать столбчатую диаграмму, вы расширите 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();

Если у вас есть похожие диаграммы, используйте Highcharts.setOptions, который после этого будет применять параметры для всех созданных диаграмм. // `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: [] }); 1024 * Ссылка *

ПОЛНОЕ ДЕМО

6 голосов
/ 21 ноября 2012

Я знаю, что на этот вопрос уже дан ответ, но я чувствую, что это можно сделать еще дальше. Я все еще новичок в JavaScript и jQuery, поэтому, если кто-то обнаружит что-то не так или решит, что такой подход нарушает правила или какие-то правила, я был бы благодарен за отзыв.

Основываясь на принципах, описанных Рикардо Ломаном, я создал плагин jQuery, который (на мой взгляд) позволяет Highcharts более беспрепятственно работать с jQuery (то есть способом, которым jQuery работает с другими объектами HTML).

Мне никогда не нравился тот факт, что вы должны предоставить идентификатор объекта в Highcharts, прежде чем он начертил диаграмму. Таким образом, с помощью плагина я могу назначить диаграмму стандартному объекту-селектору jQuery, не предоставляя содержащему <div> значение 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);

С помощью этого плагина я теперь могу назначать график следующим образом:

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

Это, конечно, упрощенный пример; для реального примера вам нужно создать более сложные свойства диаграммы. Но это принципы, которые нас интересуют здесь, и я считаю, что этот подход обращается к первоначальному вопросу. Он повторно использует код, в то же время позволяя постепенно вносить изменения в отдельные диаграммы друг на друга.

В принципе, он также позволяет группировать несколько вызовов Ajax в один, помещая параметры и данные каждого графика в один массив JavaScript.

Обязательный пример jFiddle находится здесь: http://jsfiddle.net/3GYHg/1/

Критика приветствуется !!

4 голосов
/ 20 августа 2012

Чтобы добавить к замечательному ответу @ Ricardo, я также сделал нечто очень похожее.На самом деле, я не ошибусь, если скажу, что пошел дальше, чем это.Поэтому хотел бы поделиться этим подходом.

Я создал оболочку для библиотеки старших диаграмм.Это дает множество преимуществ, так как является основными преимуществами, которые побуждают идти по этому пути

  • Разделение: Отделение вашего кода от старших диаграмм
  • Easy Upgrades: Эта обертка будет единственным кодом, который потребует модификации в случае каких-либо критических изменений API-интерфейса старшей диаграммы после обновлений или даже если кто-то решит вообще перейти на другую библиотеку диаграмм (даже от старшей диаграммы до старшей может быть исчерпывающим, если вашприложение широко использует графики)
  • Простота в использовании: API-интерфейс оболочки поддерживается очень простым, в качестве параметров отображаются только вещи, которые могут отличаться (Это тоже значения которых не будут такими глубокимиОбъект js, такой как HC, уже имеет, в основном, 1 уровень глубины), каждый из которых имеет значение по умолчанию.Таким образом, в большинстве случаев создание диаграммы у нас очень короткое: конструктор берет 1 options объект с 4-5 свойствами, значения по умолчанию которых не подходят для создаваемой диаграммы
  • Согласованный UX: Последовательный внешний вид во всем приложении.например: формат и положение всплывающей подсказки, цвета, семейство шрифтов, цвета, кнопки панели инструментов (экспорт) и т. д.
  • Избегайте дублирования: Конечно, в качестве правильного ответа на заданный вопросизбегайте дублирования, и это в огромной степени

Вот как выглядит options со значениями по умолчанию

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 : []
}

Как вы можете видеть, в большинстве случаевЭто просто chartData, который меняется.Даже если вам нужно установить какое-либо свойство, в основном это просто типы true / false, ничего подобного тому ужасу, который ожидает конструктор highchart (не критикуя их, количество предоставляемых ими опций просто удивительно с точки зрения настройки, но для каждого разработчика вкоманда, чтобы понять и освоить это может занять некоторое время)

Так что создание диаграммы так же просто, как

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