
這次做的比較簡單,是一個消息閱讀情況的展示。
是模仿Example中chart的pie.js做的。
貼下改造后的pie.js:
Ext.require('Ext.chart.*');
Ext.require(['Ext.layout.container.Fit', 'Ext.window.MessageBox']);
Ext.onReady(function () {
//store1.loadData(generateData(6, 20));
var donut = false,
chart = Ext.create('Ext.chart.Chart', {
xtype: 'chart',
animate: true,
id: 'domid',
store: store1,
shadow: true,
legend: {
position: 'right'
},
insetPadding: 60,
theme: 'Base:gradients',
/*listeners: {
click: {
element: Ext.get('domid'), //bind to the underlying el property on the panel
fn: function(o) {
//alert(o.index);
var items = chart.series.get(0).items, i;
alert(items[1].storeItem.get('name'));
}
}
},*/
series: [{
type: 'pie',
field: 'data1',
showInLegend: true,
donut: donut,
listeners : {
itemclick : function(o) {
if(o.index == 1){
var noReadStore = Ext.create('Ext.data.Store', {
fields: ['id', 'name'],
proxy: {
type: 'ajax',
api: {
read: '../mail/getNoReadMember.dhtml'
},
reader: {
type: 'json',
root: 'members'
}
}
});
noReadStore.load();
var noReadGrid = Ext.create('Ext.grid.Panel', {
border: false,
store: noReadStore,
columns: [{//實現圖標
header : 'name',
dataIndex : 'name',
flex: 1
}],
emptyText: '無未讀人員。'
});
Ext.create('Ext.Window', {
title: '未讀人員名單',
width: 180,
height: 400,
x: 100,
y: 80,
plain: true,
headerPosition: 'top',
layout: 'fit',
items: noReadGrid
}).show();
}else if(o.index == 0){
var readStore = Ext.create('Ext.data.Store', {
fields: ['id', 'name'],
proxy: {
type: 'ajax',
api: {
read: '../mail/getReadMember.dhtml'
},
reader: {
type: 'json',
root: 'members'
}
}
});
readStore.load();
var readGrid = Ext.create('Ext.grid.Panel', {
border: false,
store: readStore,
columns: [{//實現圖標
header : 'name',
dataIndex : 'name',
flex: 1
}],
emptyText: '無已讀人員。'
});
Ext.create('Ext.Window', {
title: '已讀人員名單',
width: 180,
height: 400,
x: 430,
y: 80,
plain: true,
headerPosition: 'top',
layout: 'fit',
items: readGrid
}).show();
}
}
},
tips: {
trackMouse: true,
width: 140,
height: 28,
renderer: function(storeItem, item) {
//calculate percentage.
var total = 0;
store1.each(function(rec) {
total += rec.get('data1');
});
this.setTitle(storeItem.get('name') + ': ' + Math.round(storeItem.get('data1') / total * 100) + '%');
}
},
highlight: {
segment: {
margin: 20
}
},
label: {
field: 'name',
display: 'rotate',
contrast: true,
font: '18px Arial'
}
}]
});
var panel1 = Ext.create('widget.panel', {
autoWidth: true,
height: 500,
title: '詳細閱讀情況',
renderTo: Ext.getBody(),
layout: 'fit',
tbar: [{
text: '保存圖表',
handler: function() {
Ext.MessageBox.confirm('確定下載', '您想將該圖表保存為圖片么?', function(choice){
if(choice == 'yes'){
chart.save({
type: 'image/png'
});
}
});
}
}, {
text: '刷新',
handler: function() {
// Add a short delay to prevent fast sequential clicks
window.loadTask.delay(100, function() {
store1.reload();
});
}
}, {
enableToggle: true,
pressed: false,
text: '圓環圖',
toggleHandler: function(btn, pressed) {
chart.series.first().donut = pressed ? 35 : false;
chart.refresh();
}
}],
items: chart
});
});
使用基本如上,說下點擊圖表元素事件的使用。
開始寫在chart中,找不到點擊區域的表示,之后添加在series中,通過返回參數o.index即可獲得點擊區域的標簽位置,這對於只有兩塊的圖表很好用,如果多了,應該是按右邊的索引順序來的吧。我沒試,僅是猜測。
事件部分:
series: [{ type: 'pie', field: 'data1', showInLegend: true, donut: donut, listeners : { itemclick : function(o) { alert(o.index); } } }]
之后我按照index交后台處理數據發送前台生成window顯示。
