Несколько диаграмм NVD3 на странице. Как упростить код javascript и функцию переноса?

#javascript #d3.js #nvd3.js

#javascript #d3.js #nvd3.js

Вопрос:

В настоящее время я использую NVD3 на веб-сайте для построения графиков с одной из страниц, имеющих 6 диаграмм. В настоящее время я просто добавил 6 функций для каждого из шести графиков, но я чувствую, что это не самый элегантный способ решения проблемы. Ниже приведен пример соответствующего кода html / javascript:

 <div id="chicago" class='with-3d-shadow with-transitions chart'>
  <svg> </svg>
</div>

nv.addGraph(function() {
  var chicago = nv.models.lineChart()
      .margin({top: 30, right: 60, bottom: 50, left: 80})
      .x(function(d,i) { return i })
      .color(d3.scale.category10().range());

  chicago.transitionDuration(500);

  chicago.xAxis.tickFormat(function(d) {

      var dx = testdata[0].values[d] amp;amp; testdata[0].values[d].x || 0;
      if (dx > 0) {
          return d3.time.format('%x')(new Date(dx))
      }
      return null;
  });

  chicago.yAxis
      .axisLabel('Price ($/Dth)')
      .tickFormat(function(d) { return '$'   d3.format(',.2f')(d) });

  nv.log(testdata);
  d3.select('#chicago svg')
      .datum(testdata)
      .call(chicago);

  nv.utils.windowResize(chicago.update);

  return chicago;
});
  

Как бы я обернул эту функцию, чтобы я мог повторно использовать ее несколько раз, не повторяя ее и заменяя имя (в данном случае «Чикаго») для каждого графика?

Ответ №1:

Это довольно просто, это один из способов сделать это.

HTML :

 <div id='chart1'>
    <h3>My Chart 1</h3>
    <svg></svg>
</div>
<div id='chart2'>
    <h3>My Chart 2</h3>
    <svg></svg>
</div>
<div id='chart3'>
    <h3>My Chart 3</h3>
    <svg></svg>
</div>
  

JavaScript :

 // Call my charts , pass in my div id here
drawChart('chart1');
drawChart('chart2');
drawChart('chart3');

//Donut chart example
function drawChart(div) {
    var width = height = 400;
    
    nv.addGraph(function () {
        var chart = nv.models.pieChart()
            .x(function (d) {
            return d.label
        }).y(function (d) {
            return d.value
        }).width(width)
          .height(height)
          .showLabels(true)
          .labelThreshold(.05)
          .labelType("percent")
          .donut(true);

        d3.select("#"   div   " svg")
            .datum(exampleData())
            .attr('width', width).attr('height', height)
            .transition().duration(350)
            .call(chart);

        return chart;
    });
}
  

Вот его рабочая версия.