回到主页
回到主页

Echarts控件模板

· 【用户手册】厦门艾科思移动报表平台使用,数据可视化资讯
【Designer脚本模板】

//请将$vcPlugin_demo_demoEcharts中的demo换成相应的分类标识

vsPluginComponentModule.factory('$vcPlugin_demo_demoEcharts', ['$vsPluginRegister', '$timeout', function ($vsPluginRegister, $timeout) {

//echarts的图形的默认option

var optionTemplate = {

title: {

show: false

},

legend: {

show: false,

orient : 'horizontal',

x : 'right',

y : 'top',

data:[],

textStyle: {

color: "#999",

fontSize: 12

}

},

grid: {

x: 42,

y: 34,

x2: 11,

y2: 25,

borderWidth: 0,

borderColor: "#f0f0f0"

},

tooltip : {

show:true,

confine: true,

trigger: 'axis',

axisPointer: {

type: 'shadow'

},

position: function (pos, params, dom, rect, size) {

var obj = {top: 0};

obj['left'] = pos[0] < size.viewSize[0] / 2 ? pos[1] : pos[1]-size.contentSize[0];

return obj;

}

},

calculable : false,

confine: true,

animationDuration: 500,

xAxis : [{

type : 'category',

boundaryGap: true,

axisLine: {

lineStyle: {

color: '#DDD',

width: 1,

shadowBlur: 0,

shadowOffsetX: 0,

shadowOffsetY: 0

},

show: true

},

splitArea: {

show: false

},

splitLine: {

lineStyle: {

color: '#F6F6F6'

}

},

axisTick: {

show: false

},

axisLabel: {

textStyle:{

color: '#666',

fontSize: 12

}

},

data : ['周一', '周二', '周三', '周四', '周五', '周六', '周日']

}],

yAxis : [{

name: "销售额",

type : 'value',

axisLine: {

lineStyle: {

color: '#B0B0B0',

width: 1,

shadowBlur: 0,

shadowOffsetX: 0,

shadowOffsetY: 0

},

show: true

},

splitArea: {

show: false

},

splitLine: {

lineStyle: {

color: '#F6F6F6'

}

},

axisTick: {

show: false

},

axisLabel: {

textStyle:{

color: '#666',

fontSize: 12

}

}

}],

series: [{

name: "销售额",

itemStyle: {

normal: {

color: "#006BB7",

lineStyle : {

color: "#006BB7"

}

}

},

data: [820, 932, 901, 934, 1290, 1330, 1320],

type: 'bar'

}]

};

var factory = {

//配置面板中显示[数据]配置

showDataCategory: true,

//配置面板中显示[边框]配置

showBorderCategory: true,

//配置面板中显示[基本]配置

showBasicCategory: true,

//配置面板中显示[浮动]配置

showFixedCategory: true,

//配置面板中显示[事件]配置

showEventCategory: true,

//配置面板中显示[标题]配置

showTitleCategory: true,

//配置面板中显示[预警]配置

showThresholdCategory: true,

/* 控件的初始化 */

init: function(scope, element, component, $compile){

scope.element = element;

scope.component = component;

//关闭页面过滤

component.config.pageFilter = false;

//控件的图形维度数量

scope.component.config.chartDimensionCount = 1;

//控件至少需要1个维度

scope.component.config.minDimensionCount = 1;

//控件至少需要1个度量

scope.component.config.minMeasureCount = 1;

//检查控件高度

if(element.height() == 0){

$timeout(function(){

factory.init(scope, element, component, $compile, $sce, $timeout);

},100);

}else{

factory.initChart(scope, element, component, $compile);

}

},

initChart: function(scope, element, component, $compile){

var myChart = echarts.init(element[0]);

var option = component.config.chartConfig;

if(option == null){

//初始化echarts的option默认值

option = optionTemplate;

option.noDataLoadingOption = {};

//将option保存到chartConfig对象中

component.config.chartConfig = option;

component.config.legendOrient = "horizontal";

}

option.tooltip.position = function (pos, params, dom, rect, size) {

var obj = {top: 0};

obj['left'] = pos[0] < size.viewSize[0] / 2 ? pos[0] : pos[0]-size.contentSize[0];

return obj;

};

//调用echarts的setOption方法

try{

myChart.setOption(option);

}catch(e){

}

//将chart对象放到context中

component.context.chart = myChart;

//当控件尺寸改变时,改变echarts的尺寸

component.context.resize = function(){

$timeout(function(){

if(component.context.chart.resize){

component.context.chart.resize();

}

}, 100);

}

},

/*

* 构建数据描述,此方法中对控件的数据进行处理

*/

buildDataDescription: function(dataDescription, scope, element, component, $compile){

//接收控件刷新数据的事件

scope.$on(event_refreshComponentData, function(target, param){

scope.queryComponentData(param, {

onSuccess: function(){

refreshChartView(scope, element, component, $compile);

}

});

});

//接收维度联动事件

scope.$on(event_chartDimensionValueChange, function(s, event){

var dataIndex = -1;

var axisLabels = component.config.chartConfig.xAxis[0].data;

for(var i = 0; i < axisLabels.length; i++){

if(""+axisLabels[i] === ""+event.source.value){

dataIndex = i;

break;

}

}

if(dataIndex < 0){

component.context.chart.dispatchAction({

type: 'hideTip'

});

return;

}

if(dataIndex > -1){

component.context.chart.dispatchAction({

type: 'showTip',

dataIndex:dataIndex,

seriesIndex: 0

});

}

});

},

/*

* 构建图形描述,此方法中定义控件的配置面板

*/

buildChartDescription: function(scope, element, component, $compile){

//构建[图形]配置面板

buildChartDescription(scope, element, component, $compile);

//构建[轴线]配置面板

buildAxisDescription(scope, element, component, $compile);

//构建[度量]配置面板

buildMeasureDescription(scope, element, component, $compile);

}

};

//构建[轴线]配置面板

var buildAxisDescription = function(scope, element, component, $compile){

var category = {

name: "axis",

title: "轴线",

groups: []

};

component.description.categories.push(category);

}

//构建[度量]配置面板

var buildMeasureDescription = function(scope, element, component, $compile){

var category = {

name: "measures",

title: "度量",

groups: []

};

component.description.categories.push(category);

}

//构建[图形]配置面板

var buildChartDescription = function(scope, element, component, $compile){

var category = {

name: "chart",

title: "图形",

groups: []

};

component.description.categories.push(category);

//图例

category.groups.push({

title: {

text: "图例"

},

elements: [{

title: "显示",

type: "radio",

bind: "showLegend",

items: [{

name: "开启",

value: "show"

},{

name: "关闭",

value: "hide"

}]

}, {

title: "方向",

type: "radio-icon",

bind: "legendOrient",

items: [{

name: "垂直",

value: "vertical",

icon: "fa fa-ellipsis-v"

},{

name: "水平",

value: "horizontal",

icon: "fa fa-ellipsis-h"

}]

}, {

title: "垂直位置",

type: "radio-icon",

bind: "legendPosY",

items: [{

name: "顶部",

value: "top",

icon: "fa fa-minus",

pStyle: "padding-top:0;padding-bottom:12px;"

},{

name: "居中",

value: "center",

icon: "fa fa-minus",

pStyle: "padding-top:6px;padding-bottom:6px;"

},{

name: "底部",

value: "bottom",

icon: "fa fa-minus",

pStyle: "padding-top:12px;padding-bottom:0px;"

}],

show: function(ele){

return scope.component.config.legendOrient != null && scope.component.config.legendOrient === "vertical";

}

}, {

title: "水平位置",

type: "radio-icon",

bind: "legendPosX",

items: [{

name: "左对齐",

value: "left",

icon: "fa fa-align-left"

},{

name: "居中",

value: "center",

icon: "fa fa-align-center"

},{

name: "右对齐",

value: "right",

icon: "fa fa-align-right"

}],

show: function(ele){

return scope.component.config.legendOrient != null && scope.component.config.legendOrient === "horizontal";

}

}]

});

//监听showLegend属性

scope.$watch('component.config.showLegend', function(newValue, oldValue){

if(newValue != null && (oldValue == null || oldValue !== newValue)){

var option = component.config.chartConfig;

if(option.legend == null){

option.legend = {

show: false,

orient : 'horizontal',

x : 'right',

y : 'top',

data:["销售额"],

textStyle: {

color: "#999",

fontSize: 12

}

};

option.legend.show = newValue === "show";

refreshChartView();

}else{

option.legend.show = newValue === "show";

scope.component.context.chart.setOption(option, true);

}

}

});

}

//刷新控件渲染

var refreshChartView = function(scope, element, component, $compile){

//配置的维度

var dimensions = component.config.datasourceConfig.dimensions;

//配置的度量

var measures = component.config.datasourceConfig.measures;

//获取echarts的option配置对象

var option = component.config.chartConfig;

//服务器端返回的查询数据

var data = component.context.data;

if(data == null){

return;

}

//删掉多余的指标配置

if(option.series.length > measures.length){

var newSeries = [];

for(var i = 0; i < measures.length; i++){

newSeries.push(option.series[i]);

}

option.series = newSeries;

}

//X轴的文字

var xAxisLabels = [];

for(var i = 0; i < data.length; i++){

xAxisLabels.push(data[i][dimensions[dimensions.length-1].name]);

}

if(xAxisLabels.length == 0){

xAxisLabels = [""];

}

//图例的值

var legendData = [];

for(var m = 0; m < measures.length; m++){

var serieData = [];

for(var i = 0; i < data.length; i++){

if(isNaN(data[i][measures[m].name])){

data[i][measures[m].name] = null;

}

serieData.push(data[i][measures[m].name]);

}

if(serieData.length == 0){

serieData = [""];

}

if(option.series[m] == null){

var newOption = $.extend(true, {}, optionTemplate);

option.series[m] = newOption.series[0];

}

option.series[m].data = serieData;

option.series[m].name = measures[m].label;

//度量别名

if(component.config["measureAlias_"+m] != null){

option.yAxis[0].name = component.config["measureAlias_"+m];

}

if(option.yAxis[0].name == null || option.yAxis[0].name.length == 0){

option.yAxis[0].name = measures[m].label;

}

//柱子的颜色

if(component.config["columnColor_"+m] == null){

option.series[m].itemStyle.normal.color = "#4c87b5";

}else{

option.series[m].itemStyle.normal.color=component.config["columnColor_"+m];

}

//堆积

option.series[m].stack = component.config["stack_"+m];

if(VSUtils.isEmpty(option.series[m].stack) || !option.series[m].stack){

delete option.series[m].stack;

}

//图例

var legendValue = measures[m].label;

if(component.config["measureAlias_"+m] != null && component.config["measureAlias_"+m].length > 0){

option.series[m].name = component.config["measureAlias_"+m];

legendValue = component.config["measureAlias_"+m];

}

legendData.push(legendValue);

//series的name属性

if(option.series[m].name == null || option.series[m].name.length == 0){

option.series[m].name = measures[m].label;

}

}

option.xAxis[0].data = xAxisLabels;

if(option.legend != null){

option.legend.data = legendData;

}

//如果度量数量大于1,或者配置了图例,不显示Y轴上面的名称

if(measures.length > 1 || option.legend.show === true){

option.yAxis[0].name="";

}

setTimeout(function(){

component.context.chart.dispatchAction({

type: 'hideTip'

});

setTimeout(function(){

component.context.chart.setOption(option, true);

});

});

};

//请将第一个参数"demo"换成相应的分类标识

$vsPluginRegister.register("demo", "demoEcharts", factory);

}]);

【View脚本模板】

var build_demoEcharts_component = function(scope, element, $compile, $timeout, $sce){

var component = scope.component;

var myChart = echarts.init(element[0]);

var option = component.config.chartConfig;

if(option == null){

//初始化echarts的option默认值

option = optionTemplate;

option.noDataLoadingOption = {};

//将option保存到chartConfig对象中

component.config.chartConfig = option;

component.config.legendOrient = "horizontal";

}

option.tooltip.position = function (pos, params, dom, rect, size) {

var obj = {top: 0};

obj['left'] = pos[0] < size.viewSize[0] / 2 ? pos[0] : pos[0]-size.contentSize[0];

return obj;

};

//调用echarts的setOption方法

try{

myChart.setOption(option);

}catch(e){

}

//将chart对象放到context中

component.context.chart = myChart;

//当控件尺寸改变时,改变echarts的尺寸

component.context.resize = function(){

$timeout(function(){

if(component.context.chart.resize){

component.context.chart.resize();

}

}, 100);

}

//刷新控件渲染,可直接将designer.js中的方法复制过来

var refreshChartView = function(){

//配置的维度

var dimensions = component.config.datasourceConfig.dimensions;

//配置的度量

var measures = component.config.datasourceConfig.measures;

//获取echarts的option配置对象

var option = component.config.chartConfig;

//服务器端返回的查询数据

var data = component.context.data;

if(data == null){

return;

}

//删掉多余的指标配置

if(option.series.length > measures.length){

var newSeries = [];

for(var i = 0; i < measures.length; i++){

newSeries.push(option.series[i]);

}

option.series = newSeries;

}

//X轴的文字

var xAxisLabels = [];

for(var i = 0; i < data.length; i++){

xAxisLabels.push(data[i][dimensions[dimensions.length-1].name]);

}

if(xAxisLabels.length == 0){

xAxisLabels = [""];

}

//图例的值

var legendData = [];

for(var m = 0; m < measures.length; m++){

var serieData = [];

for(var i = 0; i < data.length; i++){

if(isNaN(data[i][measures[m].name])){

data[i][measures[m].name] = null;

}

serieData.push(data[i][measures[m].name]);

}

if(serieData.length == 0){

serieData = [""];

}

if(option.series[m] == null){

var newOption = $.extend(true, {}, optionTemplate);

option.series[m] = newOption.series[0];

}

option.series[m].data = serieData;

option.series[m].name = measures[m].label;

//度量别名

if(component.config["measureAlias_"+m] != null){

option.yAxis[0].name = component.config["measureAlias_"+m];

}

if(option.yAxis[0].name == null || option.yAxis[0].name.length == 0){

option.yAxis[0].name = measures[m].label;

}

//柱子的颜色

if(component.config["columnColor_"+m] == null){

option.series[m].itemStyle.normal.color = "#4c87b5";

}else{

option.series[m].itemStyle.normal.color=component.config["columnColor_"+m];

}

//堆积

option.series[m].stack = component.config["stack_"+m];

if(VSUtils.isEmpty(option.series[m].stack) || !option.series[m].stack){

delete option.series[m].stack;

}

//图例

var legendValue = measures[m].label;

if(component.config["measureAlias_"+m] != null && component.config["measureAlias_"+m].length > 0){

option.series[m].name = component.config["measureAlias_"+m];

legendValue = component.config["measureAlias_"+m];

}

legendData.push(legendValue);

//series的name属性

if(option.series[m].name == null || option.series[m].name.length == 0){

option.series[m].name = measures[m].label;

}

}

component.context.originalXAxisLabels = null;

if(!VSUtils.isEmpty(component.config.xAxisLabelScript)){

component.context.originalXAxisLabels = angular.copy(xAxisLabels);

try{

var f = eval("(function(labelData){ "+Base64.decode(component.config.xAxisLabelScript)+"})");

f.call(null, xAxisLabels);

}catch(e){

console.log(e);

}

}

option.xAxis[0].data = xAxisLabels;

if(option.legend != null){

option.legend.data = legendData;

}

//如果度量数量大于1,或者配置了图例,不显示Y轴上面的名称

if(measures.length > 1 || option.legend.show === true){

option.yAxis[0].name="";

}

setTimeout(function(){

component.context.chart.dispatchAction({

type: 'hideTip'

});

setTimeout(function(){

component.context.chart.setOption(option, true);

});

});

};

//接收控件刷新数据的事件

scope.$on(event_refreshComponentData, function(target, param){

scope.queryComponentData(param, {

onSuccess: function(){

refreshChartView(scope, element, component, $compile);

}

});

});

//接收联动事件,可直接将designer.js中的方法复制过来

scope.$on(event_chartDimensionValueChange, function(s, event){

var dataIndex = -1;

var axisLabels = component.config.chartConfig.xAxis[0].data;

for(var i = 0; i < axisLabels.length; i++){

if(""+axisLabels[i] === ""+event.source.value){

dataIndex = i;

break;

}

}

if(dataIndex < 0){

component.context.chart.dispatchAction({

type: 'hideTip'

});

return;

}

if(dataIndex > -1){

component.context.chart.dispatchAction({

type: 'showTip',

dataIndex:dataIndex,

seriesIndex: 0

});

}

});

}

上一篇
大数据分析:原著 PK 电影,谁更得观众心?
下一篇
自定义控件配置面板元素类型列表
 回到主页
strikingly icon上线了提供技术支持
Cookie的使用
我们使用cookie来改善浏览体验、保证安全性和数据收集。一旦点击接受,就表示你接受这些用于广告和分析的cookie。你可以随时更改你的cookie设置。 了解更多
全部接受
设置
全部拒绝
Cookie设置
必要的Cookies
这些cookies支持诸如安全性、网络管理和可访问性等核心功能。这些cookies无法关闭。
分析性Cookies
这些cookies帮助我们更好地了解访问者与我们网站的互动情况,并帮助我们发现错误。
首选项Cookies
这些cookies允许网站记住你的选择,以提供更好的功能和个性化支持。
保存