Echarts的相关问题记录与应用
一、相关问题记录:
1、对图表的div进行隐藏操作,使用hide()或display:none,重新展示时,会造成图表无法获取高度,导致图表的高宽不符合预期:
解决方法:最后调用一下resize()函数, 例如: var myCharts = echarts.init($('#id')[0]), myCharts.setOption(option) myCharts.resize();
2、饼图的大小是有radius参数决定的。参数为字符串:百分比;
------------------------------------------------------------------------------------------------------------
二、Echarts应用(集成到angularjs中):
1、html:
<div id="manage_space" class="view"> <div class="data-show content"> <div class="header"> <div class="selectType"> <select data-ng-model="queryType" data-ng-options="x for (x, y) in queryTypes" > </select> </div> <span class="input-group-filters"> <input type="text" placeholder="输入关键词过滤" data-ng-model="keyword" /> </span> <span> <a class="btn btn-default btn-sm" data-ng-click="refresh()"><i class="fa fa-refresh"></i> 刷新</a> </span> </div> <div class="data-content"> <div class="loader" data-ng-if="loading">正在加载...</div> <div class="nodata-p" data-ng-if="!loading && spaces.length == 0"> <div class="nodata-c"> <small class="text-muted">抱歉,暂无数据!</small> </div> </div> <ol class="ns-list-group"> <li class="ns-list-group-item-title"> <div class="col-md-3"> <div>名称</div> </div> <div class="col-md-3"> <div>总大小</div> </div> <div class="col-md-2"> <div>预警值</div> </div> <div class="col-md-2"> <div>最小值</div> </div> <div class="col-md-2"> <div>已使用</div> </div> <div class="clearfix"></div> </li> <li class="ns-list-group-item" data-ng-repeat="space in spaces | filter : ifContain"> <div class="col-md-3"> <div><a data-ng-click="showChart(space)" href="javascript:;">{{space.name}}</a></div> </div> <div class="col-md-3"> <div>{{space.spaceInfo.capacityGigaBytes}} G</div> </div> <div class="col-md-2"> <div>{{space.spaceInfo.warningBytes}} G</div> </div> <div class="col-md-2"> <div>{{space.spaceInfo.blockBytes}} G</div> </div> <div class="col-md-2"> <div>{{space.spaceInfo.usedBytes}} G</div> </div> <div class="clearfix"></div> </li> </ol> </div> </div> <div id="h-handler" class="handler"></div> <div class="charts-show"> <div class="selectType"> <select data-ng-model="chart" data-ng-options="x for (x, y) in myCharts" > </select> </div> <div class="chart-title"> <div class="barchart-icon" data-ng-if="chart=='bar'"> <span data-ng-if="queryType=='group'" class="group-title">工作组空间使用情况</span> <span data-ng-if="queryType=='user'" class="user-title">用户空间使用情况</span> <ol> <li class="normal">正常</li> <li class="warn">警告</li> <li class="alerted">预警</li> <li class="surplus">剩余</li> </ol> </div> <div class="piechart-icon" data-ng-if="chart=='pie'"> <span data-ng-if="queryType=='group'" class="group-title">工作组空间使用情况<br/><span>单位:GB</span></span> <span data-ng-if="queryType=='user'" class="user-title">用户空间使用情况<br/><span>单位:GB</span></span> <ol> <li><span class="surpluspace">剩余</span>剩余空间</li> <li><span class="usedspace">已用</span>已用空间</li> </ol> </div> </div> <div class="bar-show col-md-11" data-ng-show="chart=='bar'" bar-charts data-source="baseunits"></div> <div class="pie-show" data-ng-show="chart=='pie'" pie-charts data-source="baseunit" data-ng-repeat="baseunit in baseunits"></div> </div> </div>
2、css
#manage_space{ margin-left: 2px; float: left; } #manage_space.view{ display: inline; } #manage_space.view>.data-show { padding: 0; width: 50%; height:100%; float: left; border: 1px solid; border-bottom: 0px; } #manage_space.view>.handler { position: absolute; left: 50%; top: 0; bottom: 0; width: 3px; background-color: transparent; } #manage_space .charts-show{ position: absolute; right: 0; width: 50%; left:50%; padding: 0; height:100%; top:0; margin-top: 10px; padding-left: 5px; overflow: auto; } #manage_space .header{ margin-top: 10px; margin-bottom: 10px; border-bottom: 1px solid; padding-bottom: 5px; } #manage_space .selectType{ float:left; margin-left:10px; } #manage_space .selectType select{ padding-right: 30px; height:26px; } #manage_space .header .input-group-filters { display: inline-block; vertical-align: middle; margin-left: 50px; margin-top:-5px; } #manage_space .header span>a{ margin-top: -2px; } #manage_space ol li{ padding-top: 5px; padding-bottom: 5px; } #manage_space .ns-list-group-item-title div{ font-weight:bold; text-align: center; } #manage_space.view>.content .ns-list-group-item { line-height: 2.0em; padding-top: 5px; padding-bottom: 5px; text-align: center; white-space: nowrap; } #manage_space .charts-show>.selectType{ float: none; margin-left: 20px; } #manage_space .charts-show>.chart-title{ float: none; margin-left: 20px; font-weight: bold; margin-top: 10px; font-size: 18px; } .barchart-icon .group-title;.barchart-icon .user-title{ text-align: left; display: block; float: left; } .barchart-icon ol{ float: right; list-style: none; font-weight: normal; font-size: 8px; } .barchart-icon ol li{ padding:2px 10px; float: left; margin-right: 3px; } .barchart-icon .normal{ background-color: #00FE69; } .barchart-icon .warn{ background-color: #FEFE1F; } .barchart-icon .alerted{ background-color: #FF0301; } .barchart-icon .surplus{ background-color: #3B9BFD; } .piechart-icon{ text-align: center; display: block; } .group-title>span , .user-title>span{ font-weight: normal; font-size: 8px; } .piechart-icon ol{ text-align: left; list-style: none; margin-top: -50px; font-weight: normal; font-size: 10px; } .piechart-icon ol li>span{ margin-right: 10px; padding:0px 3px; font-size: 6px; } .piechart-icon .surpluspace{ background: #C13530; color: #C13530; } .piechart-icon .usedspace{ background: #2E4453; color: #2E4453; } #manage_space .bar-show{ padding: 10px; height: 90%; position: absolute; text-align: center; margin-top: -20px; } #manage_space .pie-show{ padding:5px 5px 10px 10px; float:left; height: 30%; width: 30%; margin-top: -50px; margin-bottom: 20px; }
3、js
nsiteConsoleApp.controller('ManageSpaceController',function($scope, $rootScope, $filter, Proxy, Message){ $scope.resetMenu('manage', 'space'); var currentStationId = $scope.managedStationId; $scope.queryType = 'group'; $scope.queryTypes = { '工作组' :'group', '用户 ' :'user' }; $scope.chart = 'bar'; $scope.myCharts = { "柱状图":'bar', "饼图":'pie' }; $scope.$watch('queryType',function(newV,oldV,$scope){ $scope.refresh(); }); $scope.$watch('keyword',function(newV,oldV,$scope){ if(typeof(newV) == "undefined") return; $scope.baseunits = []; angular.forEach($scope.spaces,function(unit){ if(unit.name.indexOf($scope.keyword) > -1){ $scope.baseunits.push(unit); } }); }); $scope.ifContain = function(unit){ if($scope.keyword && $scope.keyword.length>0){ return unit.name.indexOf($scope.keyword) > -1; } return true; }; $scope.refresh = function(){ $scope.loading = true; $scope.spaces = []; if($scope.queryType === 'group'){ /* Proxy.security_lo.Group.findByParentId({ parentId: currentStationId }, function success(resp) { $scope.loading = false; $scope.spaces = resp; $scope.baseunits = resp; });*/ Proxy.security_lo.Group.queryAll({start:0, limit:1000}, function success(resp) { $scope.loading = false; $scope.spaces = []; $(resp.items).each(function(i, group){ if(group.stationId = currentStationId ){ $scope.spaces.push(group); } }); $scope.baseunits = $scope.spaces; }); }else{ Proxy.security_lo.User.findByParentId({ parentId: currentStationId }, function success(resp) { $scope.loading = false; $scope.spaces = resp; $scope.baseunits = resp; }); } }; //$scope.refresh(); //展示单条数据 $scope.showChart= function(baseunit){ if(baseunit.uniqueName){ $scope.baseunits = []; $scope.baseunits.push(baseunit); }else{ //获取组成员 Proxy.Security.findUsersByGroupIds({ groupIds: [baseunit.id], }, function (resp) { if(resp[0]){ $scope.baseunits = resp[0].users; }else{ Message.warn('此栏目下无用户!'); } }); } } }) .directive('barCharts',function(){ return{ restrict:'EA', scope:{ source : '=' }, template:'<div>柱图</div>', controller:function($scope){ }, link:function(scope,element,attr){ var chart = element.find('div')[0]; var parent = element['context']; var width , height; width = parent.clientWidth || 600; height = parent.clientHeight || 400; chart.style.width = (width- 0) +'px'; chart.style.height = (height- 0) + 'px'; scope.option = { title:{ text:'' }, tooltip:{ trigger:'axis', axisPointer:{ type:'shadow' } }, legend:{ // right:'right', // data:['正常','警告','预警','剩余'] }, xAxis:{ type:'value', name:'(GB)' }, yAxis:{ type: 'category', axisLabel:{ rotate:0, textStyle:{ fontSize:8, fontWeight:'bold' } }, data: [] }, grid: { left: '3%', right: '7%', bottom: '3%', containLabel: true }, series:[ { name:'已使用', type:'bar', stack:'存储空间', label:{ normal:{ show:false, position:'insideRight' } }, barWidth:'50%', data:[] }, { name:'剩 余', type:'bar', stack:'存储空间', label:{ normal:{ show:false, position:'insideRight' } }, itemStyle:{ normal:{ color:'#CBCBCB' } }, barWidth:'50%', data:[] } ] }; scope.$watch('source', function(newVal, oldVal, scope){ var baseunits = newVal; if(typeof(baseunits) == "undefined") return; chart.style.height = (height * (baseunits.length < 7 ? 7 : baseunits.length) / 10)+'px'; var barChart = echarts.init(chart); //给图表赋值 scope.option.yAxis.data = []; scope.option.series[0].data = []; scope.option.series[1].data = []; for (var int = baseunits.length - 1 ; int >=0; int--) { var baseunit = baseunits[int]; scope.option.yAxis.data.push(baseunit.name); scope.option.series[0].data.push( { value: baseunit.spaceInfo.usedBytes, itemStyle:{ normal:{ color: baseunit.spaceInfo.usedBytes*100 /baseunit.spaceInfo.capacityGigaBytes > 85 ? '#FF0301': (baseunit.spaceInfo.usedBytes*100 /baseunit.spaceInfo.capacityGigaBytes < 70) ? '#00FA67':'#CDCD19' } } } ); scope.option.series[1].data.push((baseunit.spaceInfo.capacityGigaBytes - baseunit.spaceInfo.usedBytes)<0 ? 0:(baseunit.spaceInfo.capacityGigaBytes - baseunit.spaceInfo.usedBytes)); }; barChart.setOption(scope.option); barChart.resize(); }); } }; }) .directive('pieCharts',function(){ return{ restrict:'EA', scope:{ source : '=' }, template:'<div>饼图</div>', controller:function($scope){ }, link:function(scope,element,attr){ var chart = element.find('div')[0]; var parent = element['context']; var width , height; width = parent.clientWidth || 200; height = parent.clientHeight || 200; chart.style.width = (width - 0) +'px'; chart.style.height = (height + 0) +'px'; var pieChart = echarts.init(chart); scope.option = { backgroudColor:'#F2F2F2', title : { text: '', x:'center', y:'bottom', padding:[20,0,5,0], textStyle:{ fontSize:16 } }, tooltip:{ trigger:'item', formatter:'{a}<br/>{b} {c}({d}%)', position:[-10, 10] }, series:[ { name:'空间使用', type:'pie', radius:'65%', center:['50%','60%'], label:{ normal:{ show : true, position : 'inside' } }, data:[ { value: 0 , name:'已使用',itemStyle:{ normal:{ color:'#324A5B' } }}, { value: 0, name:'未使用', itemStyle:{ normal:{ color:'#C13530' } }} ], itemStyle:{ emphasis: { shadowBlur: 10, shadowOffsetX: 0, shadowColor: 'rgba(0, 0, 0, 0.5)' } } } ] }; scope.$watch('source', function(newVal, oldVal, scope){ var baseunit = newVal; scope.option.title.text = baseunit.name; scope.option.series[0].data[0].value = baseunit.spaceInfo.usedBytes; scope.option.series[0].data[1].value = baseunit.spaceInfo.capacityGigaBytes - baseunit.spaceInfo.usedBytes; pieChart.setOption(scope.option); pieChart.resize(); }); } }; })
4、主页:
<!DOCTYPE html> <html lang="zh_CN" data-ng-app="nsiteConsoleApp"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="../3rd/font-awesome/css/font-awesome.min.css"> <link rel="stylesheet" href="../3rd/bootstrap/css/bootstrap.min.css"> <link rel="stylesheet" href="../3rd/bootstrap/css/bootstrap-theme.min.css"> <link rel="stylesheet" href="css/manage/space.css"> <script src="../3rd/echarts/echarts.js"></script> <script src="js/controllers/manage/space.js"</script> <script src="../3rd/jquery/jquery.min.js"></script> <script src="../3rd/bootstrap/js/bootstrap.min.js"></script> <script src="../3rd/angular.min.js"></script> </script> <!-- --> <script src="../3rd/date-ui/date-ui.js"></script> <!-- --> </head> <body data-ng-controller="MainController"> <header id="nv_header" data-ng-if="session.isLogged"> <nav class="navbar navbar-inverse" role="navigation"> </nav> </header> <nav id="nv_left" data-ng-if="session.isLogged"> </nav> <article id="nv_content" data-ng-view data-ng-if="session.isLogged || isLogging"></article> <footer></footer> </body> </html>
以上!