Подтвердить что ты не робот

Управление несколькими графическими диаграммами на одной веб-странице

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

{
chart : {},
blah blah,
}

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

Любая идея о том, как это сделать?

4b9b3361

Ответ 1

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

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

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

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

Ссылка

ПОЛНОЕ ДЕМО

Ответ 2

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

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

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

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

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

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

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

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

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

Ответ 3

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

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

  • Развязка: Отменяет ваш код от высоких карт
  • Easy Upgrades: Эта оболочка будет единственным кодом, который потребует модификации в случае каких-либо взломов изменений в highchart api после обновлений, или даже если вы решите полностью перейти на другую библиотеку диаграмм ( даже от highchart до highstock может быть исчерпывающим, если ваше приложение широко использует диаграммы)
  • Простота использования: Обертка api поддерживается очень просто, только объекты, которые могут меняться, отображаются как опции (это тоже значения, которые не будут такими, как глубокий js-объект, например, HC, в основном 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. Даже если вам нужно установить какое-то свойство, его в основном только истинные/ложные типы, ничего подобного ужасу, который ожидает конструктор highchart (не критикуя их, количество опций, которые они предоставляют, просто удивительно от настройки Point of View, но для каждого разработчика в команда, чтобы понять и освоить это может занять некоторое время)

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

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