【问题标题】:Morris Chart is Missing Half Part莫里斯图缺少一半
【发布时间】:2014-02-21 04:41:26
【问题描述】:

我在我的应用项目中使用了莫里斯图来显示有关销售数量的一些详细信息。

执行 AJAX 请求后,图表只显示了一半。语法如下:

var chartBahan = Morris.Bar ({
    element: 'morris-analytics-bahan',
    xkey: '2',
    ykeys: ['3'],
    labels: ['Quantity Bahan'],
    resize: false,
    gridEnabled: true
}); 

//getting the morris chart over bahan and karakteristik
function getBahanPotensial(kode){
    //ajax call
    $.ajax({
        type:"POST",
        async: false,
        url:"<%= request.getContextPath()%>/GenerateListBahanPotensial",
        data:{
            kode:kode
        },
        success: function(data){
            chartBahan.setData($.parseJSON(data));
            chartBahan.redraw();
        },
        error:function(msg){
            alert("Data Failed to Analyze" + msg); 
        }
    }); 
}

var chartKarakter = new Morris.Bar ({
    element: 'morris-analytics-karakter',
    xkey: '2',
    ykeys: ['3'],
    labels: ['Karakter Quantity'],
    resize: true
});

function getKarakterPotensial(kode){
    //ajax call
    $.ajax({
        type:"POST",
        async: false,
        url:"<%= request.getContextPath()%>/GenerateListKarakterPotensial",
        data:{
            kode:kode
        },
        success:function(data){
            chartKarakter.setData($.parseJSON(data));
            chartKarakter.redraw();
        },
        error:function(msg){
            alert("Data Failed to Analyze" + msg); 
        }
    });
}

我从另一个函数执行上述函数,比如说 doProcess()

function sendRequest(thecode){
    if(thecode === ""){ alert("Tolong Input Kode Produk");}
    else {
        var kodebarang = thecode;
    }
    //executing AJAX call.                   
    $.ajax({
        type:"POST",
        async: false,
        url:"<%= request.getContextPath()%>/GenerateAnalytics",
        data:{
            kodebarang:kodebarang
        },
        success:function(msg){
            $('#result_analysis').show();
            $('#navigation_button').show();
            new Morris.Bar ({
                element: 'morris-analytics-bar',
                data: $.parseJSON(msg),
                xkey: '1',
                ykeys: ['2', '3'],
                labels: ['Sales Area', 'Tingkat Penjualan'],
                barRatio: 0.4,
                xLabelAngle: 0,
                hideHover: 'auto'
            });

            //execute the morris chart others !! PENTING
            var kodeb = $('#bahan_id').val();
            var kodek = $('#karakteristik_id').val();
            getBahanPotensial(kodeb);
            getKarakterPotensial(kodek);
        },
        error:function(msg){
            alert("Data Failed to Analyze" + msg); 
        }
    });
}

但问题是,当我在成功回调中创建莫里斯图表时

success:function(msg){
    $('#result_analysis').show();
    $('#navigation_button').show();
    new Morris.Bar ({
        element: 'morris-analytics-bar',
        data: $.parseJSON(msg),
        xkey: '1',
        ykeys: ['2', '3'],
        labels: ['Sales Area', 'Tingkat Penjualan'],
        barRatio: 0.4,
        xLabelAngle: 0,
        hideHover: 'auto'
    });

图表正确显示。这是屏幕截图:

但是当我使用模板绘制图表时(在成功回调之外),另一个图表已损坏

这是截图

然后,我有下拉列表来根据特定参数重新生成图表,图表正确显示(所有数据显示)但图表只有半页。这是屏幕截图:

有什么想法吗?

更新

我的意思是模板是这样的代码:

var chartBahan = Morris.Bar ({
    element: 'morris-analytics-bahan',
    xkey: '2',
    ykeys: ['3'],
    labels: ['Quantity Bahan'],
    resize: false,
    gridEnabled: true
});

而调用模板的方法是

success:function(data){
    chartBahan.setData($.parseJSON(data));
    chartBahan.redraw();
},

右图是第一张截图。它比其他两个更宽。

更新 2

莫里斯创建的图表仍然出错:(

这是屏幕截图。

【问题讨论】:

  • 如果您在 3 个成功回调中绘制所有 3 个图表,“成功回调之外”在哪里?您所说的“模板”一词是什么意思,它在代码中的什么位置?最后一个屏幕截图在我看来还可以,但如果有问题,请详细说明它的外观。
  • @vorrtex 请参阅更新部分。谢谢。

标签: javascript charts morris.js


【解决方案1】:

我通过在 css 中将 svg 元素的宽度设置为 100% 解决了这个问题

svg{
  width: 100% !important
}

【讨论】:

    【解决方案2】:

    您示例中的最后两个图表在 Google Chrome 的控制台中引发了很多错误(您可以按 F12 打开它)。

    原因是当您调用Morris.Bar({ data: ... }) 时需要data 属性,但在您的示例中您没有此属性。所以你应该完全删除你的声明,比如var chartBahan = Morris.Bar (...,并用这个代码替换成功回调:

    function getBahanPotensial(kode){
        $.ajax({
        ...
            success: function(data){
                if (window.chartBahan) {
                    chartBahan.setData($.parseJSON(data));
                    // chartBahan.redraw(); // useless call, it can be removed
                } else {
                    window.chartBahan = Morris.Bar ({
                        element: 'morris-analytics-bahan',
                        data: $.parseJSON(data),
                        xkey: '2',
                        ykeys: ['3'],
                        labels: ['Quantity Bahan'],
                        resize: false,
                        gridEnabled: true
                    }); 
                }
            }
        ...
        }); 
    }
    

    在我的代码中,我检查全局变量 window.chartBahan 是否存在,如果不存在 - 我创建一个新图表;否则我打电话给setData,图表会自动更新。

    此外,您还没有发布您的 HTML 标记,它也可能存在问题。我使用了这个 HTML 代码,它运行良好:

    <body>
        <div id="morris-analytics-bar" style="height: 250px;"></div>
        <div id="morris-analytics-bahan" style="height: 250px;"></div>
        <div id="morris-analytics-karakter" style="height: 250px;"></div>
    </body>
    

    【讨论】:

    • 我没有尝试过你的方法,但我会告诉你结果如何。谢谢你的回答。
    • 我已经尝试过该方法,但我的图表显示不正确。再次查看更新的部分。谢谢。
    • 看来莫里斯图无法渲染和计算div的宽度和高度,所以它总是坏掉。我看到我的 chrome 控制台并抛出错误 Error: Invalid negative value for &lt;rect&gt; attribute width=“-1”
    • @randytan 也许你应该设置你的 div 元素的确切高度和宽度。例如style="height: 300px; width: 500px"。您的元素的宽度似乎为 0。
    • div 元素设置为style="height: auto;width: auto;" 但问题是当它设置为自动时,莫里斯图非常小。然后我将样式更改为style="height: 100%;width: 100%;",但问题仍然存在,并且两次触发时图表仅显示一半。
    【解决方案3】:

    //Java脚本代码

    Morris.Line({
          element: 'hero-area',
          data: getdata("<?php echo base_url('user/getYearlPremiumuser');?>") ,
          xkey: 'Year',
          parseTime: false,
          ykeys: ['Teacher', 'Student'],
    
          labels: ['Teacher', 'Student'],
          hideHover: 'false',
          lineWidth: 1,
          pointSize: 5,
          lineColors: ['#4a8bc2', '#ff6c60'],
          fillOpacity:7,
          smooth: true
      }); 
    

    ********//php code ( code codeigniter)********

      public function getYearlPremiumuser()
        {
    
             $teacherArray={ y: '2014', a: 50, b: 90},
      { y: '2015', a: 65,  b: 75},
      { y: '2016', a: 50,  b: 50},
      { y: '2017', a: 75,  b: 60},
      { y: '2018', a: 80,  b: 65},
      { y: '2019', a: 90,  b: 70},
      { y: '2020', a: 100, b: 75},
      { y: '2021', a: 115, b: 75},
      { y: '2022', a: 120, b: 85},
      { y: '2023', a: 145, b: 85},
      { y: '2024', a: 160, b: 95}
            for($i=0;$i<count($teacherArray);$i++)
            {
                $temp=array();
                $temp=  array_merge($teacherArray[$i],$studentarray[$i]);
                $finalResultArray[]=$temp;
    
            }
            echo json_encode($finalResultArray); 
        }
    

    click here to know more

    【讨论】:

    • 请考虑编辑您的帖子,以添加更多关于您的代码的作用以及它为何能解决问题的说明。一个大部分只包含代码的答案(即使它正在工作)通常不会帮助 OP 理解他们的问题。
    【解决方案4】:

    我在使用 Morris.js 和 Angular2 时遇到了类似的问题 - 我的问题是我在 DIV 中使用图表 *ngIf='showChart'(或 [hidden]='!showChart') - 当我设置向上图表, showChar=false 所以 div 不存在。在我的情况下,我每 1 分钟定期读取一次日期,所以在第一次 dataLoad 时我什么也看不到,在第二次 dataLoad 之后我看到图表的一半/部分)。所以我通过(打字稿)解决了这个问题:

    showchart = true;
    setTimeout( () => { this.setUpChart() }, 1 );
    

    它有效:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多