Ext 차트의 동적 생성
1. 차트는 사용자 정의할 수 있으며 정의가 완료되면 데이터베이스에 저장됩니다.
2. 데이터베이스에 저장된 도표 정의에 따라 스타일, 축, 시퀀스, 조회 조건, 조회 단추 등을 포함하여 도표를 정확하게 보여준다.
3. 데이터 원본은 설정을 통해 얻은 다음에 데이터 원본에 따라 데이터를 조회한다(같은 데이터베이스에 없을 수도 있다).
여기는 도표 정의, 데이터 출처와 도표를 보여줄 때의 조회 조건과 조회 단추 등은 상관하지 않고 Ext로 사용자 정의 도표를 정확하게 보여주는 부분에만 관심을 갖는다.
ext 문서를 보기, 탐색, 시도를 통해 ext의 도표는 주로 네 가지 문제를 포함하고 있음을 알 수 있다. 도표 자체(주로 스타일), 축, 서열과store, 그리고 축, 서열과store의 설정이 일치해야 한다. (주로 필드가 일치해야 한다.)
이제 차트를 만들 수 있습니다. 차트를 만들기 전에 축, 시퀀스, store (순서가 없음) 를 만들어야 합니다.
축을 생성하려면 다음과 같이 하십시오.
createAxes:function(axisRecords){
var axes = [];
var axis;
for(var idx = 0; idx<axisRecords.length;idx++)
{
var gridStr = axisRecords[idx].get('grid');
var grid = gridStr==""?false:Ext.JSON.decode(gridStr);
var labelStr = axisRecords[idx].get('label');
var label = labelStr==''?"":Ext.JSON.decode(labelStr);
var axisField = axisRecords[idx].get('fields');
axis = {
type: axisRecords[idx].get('axisType'),
position: axisRecords[idx].get('position'),
fields: axisField,
title: axisRecords[idx].get('title'),
dashSize:axisRecords[idx].get('dashSize'),
label : label,
grid : grid
};
axes.push(axis);
}
return axes;
}
시퀀스를 만들려면 다음과 같이 하십시오.
createSeries:function(seriesRecords){
var series = [];
var ser, labelStr, label, tipStr, tips, sourceName, xfield;
var fField ;
for(var idx=0;idx<seriesRecords.length;idx++){
fField = seriesRecords[idx].get('yField');
labelStr = seriesRecords[idx].get('label');
label = labelStr==''?"":Ext.JSON.decode(labelStr);
tipStr = seriesRecords[idx].get('tips');
tips = tipStr==''?'':Ext.JSON.decode(tipStr);
sourceName = seriesRecords[idx].get('sourceName');
xfield = seriesRecords[idx].get('xField');
xfield = xfield==null ? '' : xfield.toUpperCase();
ser = {
type: seriesRecords[idx].get('seriesType'),
axis: seriesRecords[idx].get('axis'),
highlight: true,
title : sourceName,
tips : tips,
showMarkers:true,
markerConfig:{
color: '#F00'
},
fill:seriesRecords[idx].get('fill'),
showInLegend : seriesRecords[idx].get('showLegend'),
stacked: seriesRecords[idx].get('stacked'),
xField: xfield,
yField: fField,
angleField: fField
};
if(label)
ser.label = label;
series.push(ser);
}
return series;
}
코드에서 알 수 있듯이 모든 축이나 서열은 json 형식의 대상이며, 모든 축이나 서열은 하나의 수조이다.
store 만들기:
createChartStore:function(){
var seriesRecords = Ext.getStore('ChartSeries').getRange();
var axisRecords = Ext.getStore('ChartAxes').getRange();
var fieldArr = [];
var idx, fields;
// store
for(idx = 0;idx<axisRecords.length;idx++){
fields = axisRecords[idx].get('fields');
if(fields != null)
fieldArr = Ext.Array.merge( fieldArr, fields.toUpperCase().split(','));
}
for(idx = 0;idx<seriesRecords.length;idx++){
fields = seriesRecords[idx].get('xField');
if(fields != null)
fieldArr = Ext.Array.merge( fieldArr,fields.toUpperCase().split(','));
fields = seriesRecords[idx].get('yField');
if(fields != null)
fieldArr = Ext.Array.merge( fieldArr,fields.toUpperCase().split(','));
}
// store
var store = Ext.create('Ext.data.Store', {
//pageSize :pageSize,
fields:fieldArr,
proxy: {
type : 'ajax',
url : '/hummer/application/controller/run/FindChartData.action',
reader : {
type : 'json',
root : 'rows',
totalProperty : 'totalCount'
}
},
autoLoad : false
});
var pageNum = this.getOptionValue(' ');
// , ,
store.on('beforeload', function (store, options) {
var conditionValues = Ext.getCmp('conditionForm').getForm().getValues();
var constantValue = [currentUser,currentUnit,currentYearMonth, pageNum];
var params = {queryId:queryId,paramsValue:conditionValues,constantValue:constantValue};
Ext.apply(store.proxy.extraParams, params);
});
return store;
}
나머지 문제는 비교적 간단하다. 축, 서열과store에 따라 도표를 조립하면 된다.
createChartPanel:function(btns){
var axisModels = Ext.getStore('ChartAxes').getRange();
var axes = this.createAxes(axisModels);
var mySeries = this.createSeries(Ext.getStore('ChartSeries').getRange());
var chartStyle = Ext.getStore("ChartStyle").getRange();
var pieXfield = '';
if(mySeries.length>=1 && mySeries[0]['type']=='pie'){
pieXfield = mySeries[0]['xField'];
}
var store = this.createChartStore(mySeries);
var seriesLegend = false;
var myLegend = chartStyle[0].get("legend") ;
for(var idx in mySeries){
seriesLegend = seriesLegend || (mySeries[idx]['showInLegend'] );
}
// ,
if(myLegend == null || myLegend == 'false' || myLegend == false||myLegend=='{"position":""}' || (seriesLegend == false)){
myLegend = false;
}
else{
myLegend = (myLegend == null ||myLegend == 'null' || myLegend == '') ? {position: 'bottom'} : Ext.JSON.decode(myLegend.toLowerCase());
if(!myLegend['position'])
myLegend['position'] = 'bottom';
}
//
var sortFields = [], sortField;
for(idx in axisModels){
fieldName = axisModels[idx].get('fields');
if(axisModels[idx].get('sortType')){ //
for(var i in fieldName){
sortField = {};
sortField['property'] = fieldName[i];
sortField['direction'] = axisModels[idx].get('sortType');
sortFields.push(sortField);
}
}
}
store.sort(sortFields); //
var background = chartStyle[0].get("background");
//
var border = chartStyle[0].get("border");
var myStyle = chartStyle[0].get("style");
var myChart = Ext.create("Ext.chart.Chart",{
id: 'chartCmp',
width:Ext.Number.from(chartStyle[0].get("width")),
height:Ext.Number.from(chartStyle[0].get("height")),
xtype: 'chart',
//autoSize:true,
background : background,
border : border,
style: myStyle ,
//tpl:' ',
legend: myLegend,
theme:chartStyle[0].get("theme"),
animate: chartStyle[0].get("animate"),
resizable : chartStyle[0].get("resizable"),
//shadow: true,
store: store,
axes: axes,
series: mySeries//,
});
return myChart;
}
지금까지 완전한 동적 도표가 만들어졌으니 어느 위치에 표시할지는 네가 결정해라.
이 사용자 정의 도표의 생성을 통해 알 수 있듯이 Ext의 대상은 기본적으로 설정 형식이고 json 형식과 비슷하다. 또는 json 형식이다. 그러나 이 문제에 대해 나는 Ext의 원본 코드를 깊이 파고들지 않았다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.