Javascript Chart.js抛出:未捕获类型错误:无法读取属性';长度';在同一页中打印多个图表时,为未定义
Charts.js没有绘制y轴,我尝试通过json对象动态加载chartOptions和chartData,我计划通过对web api的请求接收json对象。为了演示,我包含了虚拟json对象,该对象应该绘制图形,代码运行并执行两次循环迭代,图表部分呈现(y轴未绘制),并抛出“未捕获类型错误:无法读取未定义的属性“长度””Javascript Chart.js抛出:未捕获类型错误:无法读取属性';长度';在同一页中打印多个图表时,为未定义,javascript,jquery,json,chart.js,Javascript,Jquery,Json,Chart.js,Charts.js没有绘制y轴,我尝试通过json对象动态加载chartOptions和chartData,我计划通过对web api的请求接收json对象。为了演示,我包含了虚拟json对象,该对象应该绘制图形,代码运行并执行两次循环迭代,图表部分呈现(y轴未绘制),并抛出“未捕获类型错误:无法读取未定义的属性“长度”” var parsedJsonOption=JSON.parse(jsonContextOption); var parsedJsonData=JSON.parse(jsonC
var parsedJsonOption=JSON.parse(jsonContextOption);
var parsedJsonData=JSON.parse(jsonContextData);
变量名;
var图型;
函数addNewChart(i){
var newDiv=document.createElement(“div”);
var newCanvas=document.createElement(“画布”);
newDiv.id=“图形-”+(i+1);
newCanvas.id=“图表-”+(i+1);
newDiv.width=“600px”;
newDiv.height=“400px”;
newDiv.appendChild(newCanvas);
document.getElementById(“容器”).appendChild(newDiv);
}
函数randomColor(axisID){
var-retVal;
开关(axisID){
案例1:retVal=“rgba(255,0,0,1)”;
打破
案例2:retVal=“rgba(0255,0,1)”;
打破
案例3:retVal=“rgba(0,0255,1)”;
打破
案例4:retVal=“rgba(125125,0,1)”;
打破
案例5:retVal=“rgba(0125125,1)”;
打破
案例6:retVal=“rgba(125,0125,1)”;
打破
}
返回返回;
}
函数getInitialChartOptions(){
var chartOption={
比例:{
xAxes:[{
scaleLabel:{
显示:假,
标签字符串:“x轴-0”
},
id:'x轴-0'
}],
雅克斯:[{
scaleLabel:{
显示:对,
标签字符串:“y轴-0”
},
id:'y轴-0',
显示:对,
位置:'左'
}]
},
潘:{
启用:对,
模式:“x”
},
缩放:{
启用:对,
模式:“x”
}
};
返回图表选项;
}
函数getInitialChartData(){
var图表数据={
数据集:[{
边框颜色:“rgba(255,0255,1)”,
yAxisID:'y轴-0',
标签:“y轴-0”//图例
}]
};
返回图表数据;
}
//方法加载json中指定的选项
函数addOptionToGraph(参数元素,i,图表选项){
chartOptions.scales.yAxes[i].position=ParameterElement.yAxisPosition;
chartOptions.scales.yAxes[i].scaleLabelString=ParameterElement.yLabel;
chartData.datasets[i].label=paramElement.name;
}
//绘制图表
功能图图表(图表ID、图表数据、图表选项、图表类型){
//密谋
var myChart=document.getElementById(chartId.getContext('2d');
var chartPlot=新图表(myChart{
类型:graphType,
数据:图表数据,
选项:图表选项
});
返回图表;
}
//方法在图表的初始化阶段加载图表选项
函数showTicksAndAxis(图表、选项){
对于(变量i=1;i 1){
var yaxisid=“y轴-”+轴ID;
var scaleLabelObj={display:false,labelString:yaxisid};
var optionObj={scaleLabel:scaleLabelObj,id:yaxisid,display:false,position:'left'};
图表选项。比例。雅克斯。推(optionObj);
axisID++;
数据集数量--;
}
//在将数据加载到图表中之前添加选项
对于(var parametlementindex=0;parametlementindex)
var parsedJsonOption = JSON.parse(jsonContextOption);
var parsedJsonData = JSON.parse(jsonContextData);
var name;
var graphType;
function addNewChart(i){
var newDiv = document.createElement("div");
var newCanvas = document.createElement("canvas");
newDiv.id = "graph-"+(i+1);
newCanvas.id = "Chart-"+(i+1);
newDiv.width = "600px";
newDiv.height = "400px";
newDiv.appendChild(newCanvas);
document.getElementById("container").appendChild(newDiv);
}
function randomColor(axisID){
var retVal;
switch(axisID){
case 1: retVal = "rgba(255,0,0,1)";
break;
case 2: retVal = "rgba(0,255,0,1)";
break;
case 3: retVal = "rgba(0,0,255,1)";
break;
case 4: retVal = "rgba(125,125,0,1)";
break;
case 5: retVal = "rgba(0,125,125,1)";
break;
case 6: retVal = "rgba(125,0,125,1)";
break;
}
return retVal;
}
function getInitialChartOptions(){
var chartOption = {
scales: {
xAxes:[{
scaleLabel: {
display: false,
labelString: 'x-axis-0'
},
id: 'x-axis-0'
}],
yAxes: [{
scaleLabel: {
display: true,
labelString: 'y-axis-0'
},
id: 'y-axis-0',
display: true,
position: 'left'
}]
},
pan: {
enabled: true,
mode: 'x'
},
zoom: {
enabled: true,
mode: 'x'
}
};
return chartOption;
}
function getInitialChartData(){
var chartData = {
datasets: [{
borderColor: 'rgba(255,0,255,1)',
yAxisID: 'y-axis-0',
label: 'y-axis-0'//legend
}]
};
return chartData;
}
//method to load the options specified in the json
function addOptionToGraph(paramElement, i, chartOptions){
chartOptions.scales.yAxes[i].position = paramElement.yAxisPosition;
chartOptions.scales.yAxes[i].scaleLabel.labelString = paramElement.yLabel;
chartData.datasets[i].label = paramElement.name;
}
//plotting the chart
function plotTheChart(chartId, chartData, chartOptions, graphType){
//plot
var myChart = document.getElementById(chartId).getContext('2d');
var chartPlot = new Chart(myChart, {
type: graphType,
data: chartData,
options: chartOptions
});
return chartPlot;
}
//method to load the chartOptions in the initialization phase of the chart
function showTicksAndAxis(chartPlot, option){
for(var i=1;i<(option.parameterUIPropertiesCollection.length);i++){
if(chartPlot.options.scales.yAxes[i-1].scaleLabel.labelString != option.parameterUIPropertiesCollection[i].yLabel){
chartPlot.options.scales.yAxes[i].scaleLabel.display = true;
chartPlot.options.scales.yAxes[i].display = true;
}
}
}
//Parameter data for the particular parameter as argument i.e. "x"
function GetParameterData(x){
var parameterData = parsedJsonData.GraphParameterData[x];
if (parameterData.ParameterValues != null) {
return parameterData.ParameterValues;
}
return null;
}
function newDateString(days) {
return moment().add(days, 'd');
}
var timeFormat = "DD-MM-YYYY HH:mm:ss";
//loading the data
function setValue(j, arrayXValues, chartPlot){
i=0;
$.each(arrayXValues, function(key, datas) {
key = newDateString(key);
key = moment(key).format(timeFormat);
chartPlot.data.labels[i] = key;
chartPlot.data.datasets[j].data[i] = datas;
i++;
});
}
function loadData(chartPlot, option){
for(var j = 0; j<chartPlot.data.datasets.length; j++){
console.log("entered for "+j +" paramter");
console.log(document.getElementsByTagName('body')) ;
var arrayXValues = GetParameterData(j);
if(arrayXValues != null){
setValue(j, arrayXValues, chartPlot);
}
}
showTicksAndAxis(chartPlot, option);//to show the hidden y-axes
return chartPlot;
}
for(var ChartIndex=0; ChartIndex<parsedJsonOption.length; ChartIndex++){
console.log(ChartIndex);
addNewChart(ChartIndex);
if(parsedJsonOption[ChartIndex] != null){
var option = parsedJsonOption[ChartIndex];
}else{
continue;
}
name = option.graphName;
if (option.graphType == 0) {
graphType = "line";
}
var chartOptions = getInitialChartOptions();
var chartData = getInitialChartData();
//Following is to add the chartData datasets according ton the number of parameters provided
var axisID = 1;
var numberOfParameters = parseInt(option.parameterUIPropertiesCollection.length);
//to add the additional chartData in the chart based on the number of parameters
if(numberOfParameters > 1){
while(numberOfParameters > 1){
var yaxisid = "y-axis-" + axisID;
var color = randomColor(axisID++);//increment the axisID for the next iteration
var dataObj = {borderColor: color, yAxisID: yaxisid, label: yaxisid};
chartData.datasets.push(dataObj);
numberOfParameters--;
}
}
//Following is to add the corresponding yaxes in the chartOptions
axisID = 1;
var numberOfDatasets = chartData.datasets.length;
while(numberOfDatasets > 1){
var yaxisid = "y-axis-"+axisID;
var scaleLabelObj = {display: false, labelString: yaxisid};
var optionObj = {scaleLabel: scaleLabelObj, id: yaxisid, display: false, postion: 'left'};
chartOptions.scales.yAxes.push(optionObj);
axisID++;
numberOfDatasets--;
}
//adding the options before the data is loaded in the chart
for(var paramElementIndex=0;paramElementIndex<(option.parameterUIPropertiesCollection.length);paramElementIndex++){
paramElement = option.parameterUIPropertiesCollection[paramElementIndex];
addOptionToGraph(paramElement, paramElementIndex, chartOptions);
}
//console.log(i);
chartIdBasedOnIndex = ChartIndex;
var chartId = "Chart-"+(chartIdBasedOnIndex+1);
var chartPlot = plotTheChart(chartId, chartData, chartOptions, graphType);
chartPlot = loadData(chartPlot, option);
chartPlot.update();
}