我在我的应用程序项目中使用了morris图表来显示有关销售数量的一些细节。
执行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);
}
});
}
但问题是,当我在成功回调中创建Morris图表时
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'
});
图表正确显示。这是屏幕截图:
但另一张图表,当我使用模板进行图表制作时(成功回调之外)图表是BROKEN
这是截图
然后,我有下拉列表根据特定参数重新生成图表,图表正确显示(所有数据显示)但图表只有半页。这是截图:
有什么想法会发生什么吗?
更新
我的意思是模板是这样的代码:
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
在莫里斯创建的图表上仍然出现错误:(
这是截图。
答案 0 :(得分:4)
我通过在css
中将svg元素的宽度设置为100%来解决该问题svg{
width: 100% !important
}
答案 1 :(得分:0)
您示例中的最后两个图表在Google Chrome控制台中引发了大量错误(您可以按F12打开它)。
原因是当您致电data
时需要Morris.Bar({ 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>
答案 2 :(得分:0)
// 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);
}
答案 3 :(得分:0)
我有类似的问题使用Morris.js和Angular2 - 在我的情况下的问题是我在DIV中使用图表* ngIf =&#39; showChart&#39; (或[hidden] =&#39;!showChart&#39;) - 当我设置图表时,showChar = false所以div不存在。在我的情况下,我每1分钟读取一次日期,所以在第一次dataLoad我看不到任何东西,在第二次dataLoad后,我看到图表的一半/部分)。所以我通过(typescript)解决这个问题:
@model myProj.ViewModels.CitiesViewModel
...some html here...
<select asp-for="SelectedCities" asp-items="Model.Cities"</select>
...some html here...
它有效:)