📄 chart.js
字号:
/*
* Ext JS Library 3.0 Pre-alpha
* Copyright(c) 2006-2008, Ext JS, LLC.
* licensing@extjs.com
*
* http://extjs.com/license
*/
/**
* @class Ext.chart.Chart
* @extends Ext.FlashComponent
* @constructor
* @xtype chart
*/
Ext.chart.Chart = Ext.extend(Ext.FlashComponent, {
url: "http:/"+"/yui.yahooapis.com/2.5.1/build/charts/assets/charts.swf",
refreshBuffer: 100,
// style defaults
chartStyle: {
padding: 10,
animationEnabled: true,
font: {
name: 'Tahoma',
color: 0x444444,
size: 11
},
dataTip: {
padding: 5,
border: {
color: 0x99bbe8,
size:1
},
background: {
color: 0xDAE7F6,
alpha: .9
},
font: {
name: 'Tahoma',
color: 0x15428B,
size: 10,
bold: true
}
}
},
initComponent : function(){
Ext.chart.Chart.superclass.initComponent.call(this);
this.addEvents(
'itemmouseover',
'itemmouseout',
'itemclick',
'itemdoubleclick',
'itemdragstart',
'itemdrag',
'itemdragend'
);
},
/**
* Sets a single style value on the Chart instance.
*
* @param name {String} Name of the Chart style value to change.
* @param value {Object} New value to pass to the Chart style.
*/
setStyle: function(name, value){
value = Ext.encode(value);
this.swf.setStyle(name, value);
},
/**
* Resets all styles on the Chart instance.
*
* @param styles {Object} Initializer for all Chart styles.
*/
setStyles: function(styles){
styles = Ext.encode(styles);
this.swf.setStyles(styles);
},
/**
* Sets the styles on all series in the Chart.
*
* @param styles {Array} Initializer for all Chart series styles.
*/
setSeriesStyles: function(styles){
for(var i = 0; i < styles.length; i++){
styles[i] = Ext.encode(styles[i]);
}
this.swf.setSeriesStyles(styles);
},
setCategoryNames : function(names){
this.swf.setCategoryNames(names);
},
setTipRenderer : function(fn){
var chart = this;
this.tipFnName = this.createFnProxy(function(item, index, series){
var record = chart.store.getAt(index);
return fn(chart, record, index, series);
}, this.tipFnName);
this.swf.setDataTipFunction(this.tipFnName);
},
setSeries : function(series){
this.series = series;
this.refresh();
},
/**
* Changes the data store bound to this chart and refreshes it.
* @param {Store} store The store to bind to this chart
*/
bindStore : function(store, initial){
if(!initial && this.store){
this.store.un("datachanged", this.refresh, this);
this.store.un("add", this.delayRefresh, this);
this.store.un("remove", this.delayRefresh, this);
this.store.un("update", this.delayRefresh, this);
this.store.un("clear", this.refresh, this);
if(store !== this.store && this.store.autoDestroy){
this.store.destroy();
}
}
if(store){
store = Ext.StoreMgr.lookup(store);
store.on("datachanged", this.refresh, this);
store.on("add", this.delayRefresh, this);
store.on("remove", this.delayRefresh, this);
store.on("update", this.delayRefresh, this);
store.on("clear", this.refresh, this);
}
this.store = store;
if(store && !initial){
this.refresh();
}
},
onSwfReady : function(isReset){
Ext.chart.Chart.superclass.onSwfReady.call(this, isReset);
this.swf.setType(this.type);
if(this.chartStyle){
this.setStyles(this.chartStyle);
}
if(this.categoryNames){
this.setCategoryNames(this.categoryNames);
}
if(this.tipRenderer){
this.setTipRenderer(this.tipRenderer);
}
if(!isReset){
this.bindStore(this.store, true);
}
this.refresh.defer(10, this);
},
delayRefresh : function(){
if(!this.refreshTask){
this.refreshTask = new Ext.util.DelayedTask(this.refresh, this);
}
this.refreshTask.delay(this.refreshBuffer);
},
refresh : function(){
var styleChanged = false;
// convert the store data into something YUI charts can understand
var data = [], rs = this.store.data.items;
for(var j = 0, len = rs.length; j < len; j++){
data[j] = rs[j].data;
}
//make a copy of the series definitions so that we aren't
//editing them directly.
var dataProvider = [];
var seriesCount = 0;
var currentSeries = null;
var i = 0;
if(this.series){
seriesCount = this.series.length;
for(i = 0; i < seriesCount; i++){
currentSeries = this.series[i];
var clonedSeries = {};
for(var prop in currentSeries){
if(prop == "style" && currentSeries.style !== null){
clonedSeries.style = Ext.encode(currentSeries.style);
styleChanged = true;
//we don't want to modify the styles again next time
//so null out the style property.
// this causes issues
// currentSeries.style = null;
} else{
clonedSeries[prop] = currentSeries[prop];
}
}
dataProvider.push(clonedSeries);
}
}
if(seriesCount > 0){
for(i = 0; i < seriesCount; i++){
currentSeries = dataProvider[i];
if(!currentSeries.type){
currentSeries.type = this.type;
}
currentSeries.dataProvider = data;
}
} else{
dataProvider.push({type: this.type, dataProvider: data});
}
this.swf.setDataProvider(dataProvider, (this.isFirst = (this.isFirst === undefined)));
},
createFnProxy : function(fn, old){
if(old){
delete window[old];
}
var fnName = "extFnProxy" + (++Ext.chart.Chart.PROXY_FN_ID);
window[fnName] = fn;
return fnName;
}
});
Ext.reg('chart', Ext.chart.Chart);
Ext.chart.Chart.PROXY_FN_ID = 0;
/**
* @class Ext.chart.PieChart
* @extends Ext.chart.Chart
* @constructor
* @xtype piechart
*/
Ext.chart.PieChart = Ext.extend(Ext.chart.Chart, {
type: 'pie',
onSwfReady : function(isReset){
Ext.chart.PieChart.superclass.onSwfReady.call(this, isReset);
this.setDataField(this.dataField);
this.setCategoryField(this.categoryField);
},
setDataField : function(field){
this.dataField = field;
this.swf.setDataField(field);
},
setCategoryField : function(field){
this.categoryField = field;
this.swf.setCategoryField(field);
}
});
Ext.reg('piechart', Ext.chart.PieChart);
/**
* @class Ext.chart.CartesianChart
* @extends Ext.chart.Chart
* @constructor
* @xtype cartesianchart
*/
Ext.chart.CartesianChart = Ext.extend(Ext.chart.Chart, {
onSwfReady : function(isReset){
Ext.chart.CartesianChart.superclass.onSwfReady.call(this, isReset);
if(this.xField){
this.setXField(this.xField);
}
if(this.yField){
this.setYField(this.yField);
}
if(this.xAxis){
this.setXAxis(this.xAxis);
}
if(this.yAxis){
this.setYAxis(this.yAxis);
}
},
setXField : function(value){
this.xField = value;
this.swf.setHorizontalField(value);
},
setYField : function(value){
this.yField = value;
this.swf.setVerticalField(value);
},
setXAxis : function(value){
this.xAxis = this.createAxis('xAxis', value);
this.swf.setHorizontalAxis(this.xAxis);
},
setYAxis : function(value){
this.yAxis = this.createAxis('yAxis', value);
this.swf.setVerticalAxis(this.yAxis);
},
createAxis : function(axis, value){
var o = Ext.apply({}, value), oldFn = null;
if(this[axis]){
oldFn = this[axis].labelFunction;
}
if(o.labelRenderer){
var fn = o.labelRenderer;
o.labelFunction = this.createFnProxy(function(v){
return fn(v);
}, oldFn);
delete o.labelRenderer;
}
return o;
}
});
Ext.reg('cartesianchart', Ext.chart.CartesianChart);
/**
* @class Ext.chart.LineChart
* @extends Ext.chart.CartesianChart
* @constructor
* @xtype linechart
*/
Ext.chart.LineChart = Ext.extend(Ext.chart.CartesianChart, {
type: 'line'
});
Ext.reg('linechart', Ext.chart.LineChart);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -