为了账号安全,请及时绑定邮箱和手机立即绑定

请问如何使用EXT JS查询数据库动态生成如下图的二维折线图?

请问如何使用EXT JS查询数据库动态生成如下图的二维折线图?

狐的传说 2019-04-26 18:15:19
数据库查询只给我返回三个字段,如下图所示:网上的自定义插件如下图: /**  *   * @author LuoYu  * @date 2012-12-04  * 基于EXT-3.3.0开发的可以添加动态折线数的EXT.chart.DynamicLineChart插件  * 初使化方法可以通过 new Ext.chart.DynamicLineChart(),  * 也可以通过xtype的形式,xtype:dynamiclinechart  *   */ Ext.chart.DynamicLineChart = Ext.extend(Ext.chart.LineChart,{     initComponent : function() {         var store = new Ext.data.Store({             url : this.loadUrl,             reader : new Ext.data.JsonReader()         });         var config = {             store : store,             xField: this.xField,             series : new Array(),             extraStyle:{                   legend:{                     display: 'bottom',                       padding: 5,                       font:{                           family: 'Tahoma',                           size: 13                       }                   }               }         };         Ext.apply(this, config);         Ext.apply(this.initialConfig, config);         Ext.chart.DynamicLineChart.superclass.initComponent.apply(this, arguments);     },     onRender : function() {         Ext.chart.DynamicLineChart.superclass.onRender.apply(this,arguments);         this.store.on('load', function() {             if (typeof (this.store.reader.jsonData.series) === 'object') {                 var series = [];                 Ext.each(this.store.reader.jsonData.series, function(serie) {                     series.push(serie);                 });                 this.setSeries(series);             }         }, this);         this.store.load();     } }); Ext.reg("dynamiclinechart", Ext.chart.DynamicLineChart);网上的JSON返回格式如下图:
查看完整描述

10 回答

?
HUH函数

TA贡献1836条经验 获得超4个赞

你的值相差太大了,我这里大概做了个demo,都连一起了。。数据要处理成{x:'x列值',z中存在的名称:'对应的y值'.....}此类数据加载就行了
https://img1.sycdn.imooc.com//5cd91e990001b8a205740266.jpg

查看完整回答
反对 回复 2019-05-13
?
慕神8447489

TA贡献1780条经验 获得超1个赞

 <html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Line Chart</title>
    <link rel="stylesheet" type="text/css" href="../../resources/css/ext-all.css" />
    <script type="text/javascript" src="../../ext-all.js"></script>
    <script>
        Ext.onReady(function () {
            ////////////////////////////////////////////数据,服务器生成此类数据就行,和你数据库结构一样,
            直接序列化为json格式字符串复制给给对应的变量
            data = [{ x: '06:00', y: 123, z: '1#干式变压器' },
       { x: '13:00', y: 4, z: '1#干式变压器' },
       { x: '18:00', y: 0.99, z: '1#干式变压器' },
       { x: '20:00', y: 0.99, z: '1#干式变压器' },
       { x: '22:30', y: 0.99, z: '1#干式变压器' },
       { x: '06:00', y: 543, z: '2#干式变压器' },
       { x: '13:00', y: 5, z: '2#干式变压器' },
       { x: '18:00', y: 0.97, z: '2#干式变压器' },
       { x: '20:00', y: 0.96, z: '2#干式变压器' },
       { x: '22:30', y: 0.97, z: '2#干式变压器' },
       { x: '06:00', y: 0.97, z: '3#干式变压器' },
       { x: '13:00', y: 7, z: '3#干式变压器' },
       { x: '18:00', y: 0.97, z: '3#干式变压器' },
       { x: '20:00', y: 0.96, z: '3#干式变压器' },
       { x: '22:30', y: 0.97, z: '3#干式变压器' }]
            ////////////////////////////////////////////
            //数据转换 z/y数据整合
            fields = ['x']//store的列
            series = []//chart的series配置
            mydata = []//处理后store加载的值,和fields对应,变为[{x:'时间',z的值:'对应的y'...更多z的值对应y}]这种格式
            maxLineName = ''; maxY = 0;//记录y最大值,以便获取最大值的z值作为chart的y轴
            kvZ = {}//记录fields是否已经压入过唯一的z值
            var arrColor = ['red', 'blue', 'green', 'yellow', 'gray']//每条轴的颜色,如果很多继续扩展这个数组,要不超过5条颜色会重复
            for (var i = 0; i < data.length; i++) {
                lineName = data[i].z;
                if (maxLineName == '') { maxLineName = lineName; maxY = data[i].y }
                else if (data[i].y > maxY) { maxLineName = lineName; maxY = data[i].y }
                if (!kvZ[lineName]) {
                    kvZ[lineName] = true;
                    color = arrColor[fields.length%arrColor.length]
                    fields.push(lineName)
                    series.push((function (lineName) {
                        return {
                            type: 'line',
                            axis: 'left',
                            xField: 'x',
                            yField: lineName,
                            style: { fill: color, stroke: color, 'stroke-width': 3 },
                            markerConfig: { type: 'circle', size: 4, radius: 4, 'stroke-width': 0, fill: color, stroke: color },
                            tips: {
                                trackMouse: true,
                                width: 80,
                                height: 40,
                                renderer: function (storeItem, item) {
                                    console.log(lineName)
                                    this.setTitle(storeItem.get('x'));
                                    this.update(storeItem.get(lineName));
                                }
                            }
                        }
                    })(lineName));
                }
            }
            kvT = {}
            function fillExist(arr, x, v, attr) {
                for (var i = 0; i < arr.length; i++) if (arr[i].x == x) { arr[i][attr] = v; break; }
            }
            for (var i = 0; i < data.length; i++) {
                x = data[i].x
                if (kvT[x]) fillExist(mydata, x, data[i].y, data[i].z);
                else {
                    item = { x: data[i].x };
                    for (attr in kvZ) item[attr] = attr == data[i].z ? data[i].y : 0
                    mydata.push(item)
                    kvT[x] = true;
                }
            }


            mystore = Ext.create('Ext.data.JsonStore', {
                fields: fields,
                data: mydata
            });
            Ext.create('Ext.chart.Chart', {
                renderTo: document.body,
                xtype: 'chart',
                legend: { position: 'right' },
                animate: false,
                store: mystore, height: 300, width: 600,
                insetPadding: 30,
                axes: [
                    { type: 'Numeric', minimum: 0, position: 'left', fields: [maxLineName], title: true, grid: true },
                    { type: 'Category', position: 'bottom', fields: ['x'], title: true }],
                series: series
            });

        })
    </script>
</head>
    <body id="docbody">
    </body>
</html>


查看完整回答
反对 回复 2019-05-13
?
慕仙森

TA贡献1827条经验 获得超8个赞

https://img1.sycdn.imooc.com//5cd91ed9000121ef07230239.jpg

最新截图:
问题就出在这里,通过调试发现records 是最新的,但是mydata还是之前的.......

查看完整回答
反对 回复 2019-05-13
?
慕村9548890

TA贡献1884条经验 获得超4个赞

https://img1.sycdn.imooc.com//5cd91ee30001484906500492.jpg

查看完整回答
反对 回复 2019-05-13
?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

这是返回的JSON格式样例


查看完整回答
反对 回复 2019-05-13
?
守候你守候我

TA贡献1802条经验 获得超10个赞

你好,这是所有的JS代码,ajax请求数据库返回数据跟你的格式是一样的,但是页面出现这个错误,如下图,:
https://img1.sycdn.imooc.com//5cd91f080001d2f005980160.jpg
错误对应到的是我的这一行,请问您知道是哪里出问题了吗....:

https://img1.sycdn.imooc.com//5cd91f0b000107c310990152.jpg

        var powerStore = Ext.create('Ext.data.JsonStore', {
        fields: ['x','y','z'],
        autoLoad: false,
        proxy: {
            type: 'ajax',
            url: Eap.contextPath + '/eap/scripts/run-script/smartassets-index-Power.gson',
            reader: {
                type: 'json',
                root: 'models'
                    }
                }
            });

            var fields = ['x']; 
            var series = [];                                            //轴线配置
            var mydata = [];                                            //存放整理后的Store
            var maxLineName = '';                                       //记录Z最大值
            var maxY = 0;                                               //记录y最大值,以便获取最大值的z值作为chart的y轴
            var kvZ = {};                                               //记录fields是否已经压入过唯一的z值
            var arrColor = ['red', 'blue', 'green', 'yellow', 'gray'];  //每条轴线的颜色,如果很多就继续扩展这个数组,不然超过5条,颜色会重复

        powerStore.load({
            scope: this,
            callback: function(records, operation, success) {
                for (var i = 0; i < records.length; i++) {
                    lineName = records[i].get('z');
                    if (maxLineName == '') {
                        maxLineName = lineName; 
                        maxY = records[i].get('y');
                    }
                    if (!kvZ[lineName]) {
                        kvZ[lineName] = true;
                        color = arrColor[fields.length%arrColor.length]
                        fields.push(lineName)
                        series.push((function (lineName) {
                        return {
                            type: 'line',
                            axis: 'left',
                            xField: 'x',
                            yField: lineName,
                            style: { fill: color, stroke: color, 'stroke-width': 3 },
                            markerConfig: { type: 'circle', size: 4, radius: 4, 'stroke-width': 0, fill: color, stroke: color },
                            tips: {
                                trackMouse: true,
                                width: 80,
                                height: 40,
                                renderer: function (storeItem, item) {
                                    this.setTitle(storeItem.get('x'));
                                    this.update(storeItem.get(lineName));
                                }
                            }
                        }
                    })(lineName));
                }
              }

            kvT = {}
            function fillExist(arr, x, v, attr) {
                for (var i = 0; i < arr.length; i++) if (arr[i].x == x) { 
                    arr[i][attr] = v; 
                    break; 
                    }
            }

            for (var i = 0; i < records.length; i++) {
                x = records[i].get('x')
                if(kvT[x]){
                    fillExist(mydata, x, records[i].get('y'), records[i].get('z'));
                    }
                else {
                    item = { x: records[i].get('x') };
                    for (attr in kvZ) item[attr] = attr == records[i].get('z') ? records[i].get('y') : 0
                    mydata.push(item)
                    kvT[x] = true;
                    }
                 }        
           }
        });

    console.log(fields)
    console.log(mydata)

    var newStore = Ext.create('Ext.data.JsonStore', {
             fields: fields,
             data: mydata
            });

    var powerPortlet = Ext.create({
             legend: { position: 'right' },
             xtype: 'cartesian',
             width: 300,
             height: 250,
             store: newStore,
             axes: [
                    { type: 'Numeric', minimum: 0, position: 'left', fields: [maxLineName], title: true, grid: true },
                    { type: 'Category', position: 'bottom', fields: ['x'], title: true }],
             series: series
            });

    var powerPanel = Ext.create('Ext.panel.Panel', {
        id: 'powerPortlet',
        multiSelect: true,
        layout: 'fit',
        border: 0,
        items:[powerPortlet],
        viewConfig: {
            stripeRows: true,
            enableTextSelection: true
        },
        refreshPortlet: function() {
            newStore.load();
        }


查看完整回答
反对 回复 2019-05-13
?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

https://img1.sycdn.imooc.com//5cd91f3100014cb707120359.jpg

https://img1.sycdn.imooc.com//5cd91f320001639406560635.jpg

查看完整回答
反对 回复 2019-05-13
  • 10 回答
  • 0 关注
  • 691 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号