import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core'; import { CosmosChartService } from '../common/chart.service'; import { ChartCommon, IChartData, IChartSettings } from './../common/chart.common'; export interface IStitchesSettings extends IChartSettings { legendShow?: boolean; xAxisType?: string; yAxisType?: any[]; yAxisName?: any[]; axisSite?: object; } @Component({ selector: 'cm-stitches', templateUrl: './stitches.component.html', styleUrls: ['./stitches.component.less'] }) export class CosmosStitchesComponent extends ChartCommon implements OnInit, OnDestroy { constructor(private chartService: CosmosChartService) { super(chartService); } // 配置基础 option defineChartOption(): {} { return { tooltip: { trigger: 'axis' }, grid: { width: '78%' }, legend: { type: 'scroll', orient: 'vertical', right: 10, top: 20, bottom: 10, data: [] }, xAxis: [{ type: 'category', boundaryGap: false, data: [] }], yAxis: [{ type: 'value' }], series: [] }; } // 外部传入 data 经过处理合并到 option chartDataChange(data: IChartData): any { if (!data || !data.columns || !data.rows || !data.rows.length || !data.columns.length) { return; } let datalen = data.rows.length; if (this._chartSettings && this._chartSettings.dimension && this._chartSettings.dimension.length) { this.chartOption.xAxis = []; let dimension = this._chartSettings.dimension; for (let i = 0; i < dimension.length; i++) { if (!this.chartOption.xAxis[i]) { this.chartOption.xAxis[i] = {boundaryGap: false, type: 'category'}; } this.chartOption.xAxis[i].data = []; for (let j = 0; j < datalen; j++) { this.chartOption.xAxis[i].data.push(data.rows[j][dimension[i]]); } } } else { this.chartOption.xAxis[0].data = []; for (let i = 0; i < datalen; i++) { this.chartOption.xAxis[0].data.push(data.rows[i][data.columns[0]]); } } if (this._chartSettings && this._chartSettings.metrics) { this.chartOption.legend.data = this._chartSettings.metrics; } else { this.chartOption.legend.data = data.columns.slice(1); } let len = this.chartOption.legend.data.length; this.chartOption.series = []; for (let i = 0; i < len; i++) { if (!this.chartOption.series[i]) { this.chartOption.series[i] = {}; } this.chartOption.series[i].name = this.chartOption.legend.data[i]; this.chartOption.series[i].type = 'line'; this.chartOption.series[i].smooth = true; this.chartOption.series[i].data = []; for (let j = 0; j < datalen; j++) { this.chartOption.series[i].data.push(data.rows[j][this.chartOption.legend.data[i]]); } } return null; } // 外部传入 settings 经过处理合并到 option chartSettingsChange(settings: IStitchesSettings): any { if (settings.dimension || settings.metrics) { this.chartDataChange(this._chartData); } if (settings.xAxisType) { for (let i = 0; i < this.chartOption.xAxis.length; i++) this.chartOption.xAxis[i].type = settings.xAxisType; } if (settings.yAxisType && settings.yAxisType.length) { for (let i = 0; i < settings.yAxisType.length; i++) { if (!this.chartOption.yAxis[i]) { this.chartOption.yAxis[i] = {type: 'value'}; } if (settings.yAxisType[i] == 'KMB') { this.chartOption.yAxis[i].axisLabel = { formatter: function (param: any) { return param/1000 + 'k'; } } } else if (settings.yAxisType[i] == 'percent') { this.chartOption.yAxis[i].axisLabel = { formatter: function (param: any) { return param*100 + '%'; } } } this.chartOption.yAxis[i].name = settings.yAxisName && settings.yAxisName[i] || ''; } } if (settings.axisSite && settings.axisSite['right'] && settings.axisSite['right'].length) { let axisR = settings.axisSite['right']; for (let i = 0; i < axisR.length; i++) { for (let j = 0; j < this.chartOption.series.length; j++) { if (axisR[i] == this.chartOption.series[j].name) { this.chartOption.series[j].yAxisIndex = 1; break; } } } } if (settings.legendShow == false) { this.chartOption.legend.show = false; } else if (settings.legendShow || settings.legendShow == null || settings.legendShow == undefined) { this.chartOption.legend.show = true; } return null; } ngOnInit() { this.chartContainer = this.canvas.nativeElement; } // echarts 初始化自动调用 onInitChart() { } // echarts 销毁后自动调用 onDestroyChart() { } ngOnDestroy() { this.disposeChart(); } }