ZP的EXTJS学习笔记(四)——图表的简单使用(图表点击事件)

这次做的比较简单,是一个消息阅读情况的展示。

是模仿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显示。

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。