Chart.js - 在一个页面上创建多个图表

3
我希望在我的Joomla组件“bestia”中使用chart.js。为此,我在manifest.xml中将chart.js作为媒体元素导入。
我的调用方式如下: JHtml::script(Juri::root() . 'media/com_hostinghelden/chartjs/Chart.js'); 现在我想使用helper来简化一些操作。我的helper应该绘制一个图形...
abstract class JHtmlGraphs 
{
    public function draw($title = NULL, $labelset = NULL, $data = NULL, $data2 = NULL)
    {
        $script = "<script> var barChartData_$title = { labels : [ {$labelset} ], datasets : [ { fillColor : 'rgba(220,220,220,0.5)', strokeColor : 'rgba(220,220,220,0.8)', highlightFill: 'rgba(220,220,220,0.75)', highlightStroke: 'rgba(220,220,220,1)', data : [ $data ] }, { fillColor : 'rgba(151,187,205,0.5)', strokeColor : 'rgba(151,187,205,0.8)', highlightFill : 'rgba(151,187,205,0.75)', highlightStroke : 'rgba(151,187,205,1)', data : [ $data2 ] } ] }; window.onload = function(){ var ctx_$title = document.getElementById('canvas_$title').getContext('2d'); window.myBar = new Chart(ctx_$title).Bar(barChartData_$title, { responsive : true }); } </script>";
        $canvas = "<div style='width: 100%'><canvas id='canvas_$title' height='20' width='20'></canvas></div>";
        return $script . $canvas;
    }
}

如果我将它命名为Jhtml-Graphs,则图形将被正确地呈现:

<?php echo JHtml::_('graphs.draw', "Titel", $labelset, $data, $data2);  ?>

但是,如果我想在页面上添加第二个图表,则第一个图表将不再显示:

<?php echo JHtml::_('graphs.draw', "Titel2", $labelset, $data, $data2); ?>

我该怎么办?

没有错误信息在控制台中... - user3755325
1个回答

2
您正在重新声明window.onload函数。这就是为什么您只会绘制一个(最后一个)图表的原因。
window.onload = function(){ 
    var ctx_$title = document.getElementById('canvas_$title').getContext('2d');                                    
    window.myBar = new Chart(ctx_$title).Bar(barChartData_$title, { responsive : true }); 

}

您可以进行以下操作来解决此问题。我建议将JHtmlGraphs类更改如下:

    abstract class JHtmlGraphs 
{
    private $titles = array();

    public function draw($title = NULL, $labelset = NULL, $data = NULL, $data2 = NULL)
    {
        $script = "<script> var barChartData_$title = { labels : [ {$labelset} ], datasets : [ { fillColor : 'rgba(220,220,220,0.5)', strokeColor : 'rgba(220,220,220,0.8)', highlightFill: 'rgba(220,220,220,0.75)', highlightStroke: 'rgba(220,220,220,1)', data : [ $data ] }, { fillColor : 'rgba(151,187,205,0.5)', strokeColor : 'rgba(151,187,205,0.8)', highlightFill : 'rgba(151,187,205,0.75)', highlightStroke : 'rgba(151,187,205,1)', data : [ $data2 ] } ] };</script>";
        $canvas = "<div style='width: 100%'><canvas id='canvas_$title' height='20' width='20'></canvas></div>";

        $this->titles[] = $title; //storing titles
        return $script . $canvas;
    }

    public function finishDrawing() {
        $launchCharts = '';
        foreach($this->titles as $title) {
            $launchCharts .= "var ctx_$title = document.getElementById('canvas_$title').getContext('2d'); window.myBar_$title = new Chart(ctx_$title).Bar(barChartData_$title, { responsive : true });";
        }
        $this->titles = array();

        $script =  "<script>window.onload = function(){ $launchCharts }</script>";
        return $script;
    }
}

我修改了你的脚本。现在,你的onload函数将从finishDrawing方法生成一次:
<?php echo JHtml::_('graphs.draw', "Titel", $labelset, $data, $data2);  ?>
<?php echo JHtml::_('graphs.draw', "Titel2", $labelset, $data, $data2); ?>

在底部你需要调用新函数:

<?php echo JHtml::finishDrawing(); //you better know than me how to call this function?>

谢谢你的回答。不幸的是,我不是那种JavaScript专家... 我该怎么办?如何使用我的辅助程序绘制多个图表,而不必重新声明window.onload? - user3755325
@user3755325,我已经更新了我的答案。希望没有任何错误-未经测试。 - Kasyx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接