Created
July 30, 2014 05:58
-
-
Save otakustay/543fc4424937098f51f1 to your computer and use it in GitHub Desktop.
for jscs test
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* ADM 2.0 | |
* Copyright 2014 Baidu Inc. All rights reserved. | |
* | |
* @ignore | |
* @file 地域地图控件 | |
* @author lixiang(lixiang05@baidu.com) | |
*/ | |
define( | |
function (require) { | |
var lib = require('esui/lib'); | |
var u = require('underscore'); | |
var Control = require('esui/Control'); | |
var echarts = require('echarts'); | |
require('echarts/chart/map'); | |
require('echarts/chart/pie'); | |
var regionMap = [ | |
{ | |
regionName: '北京', | |
regionId: '1' | |
}, | |
{ | |
regionName: '天津', | |
regionId: '3' | |
}, | |
{ | |
regionName: '上海', | |
regionId: '2' | |
}, | |
{ | |
regionName: '重庆', | |
regionId: '4' | |
}, | |
{ | |
regionName: '河北', | |
regionId: '15' | |
}, | |
{ | |
regionName: '河南', | |
regionId: '16' | |
}, | |
{ | |
regionName: '云南', | |
regionId: '33' | |
}, | |
{ | |
regionName: '辽宁', | |
regionId: '23' | |
}, | |
{ | |
regionName: '黑龙江', | |
regionId: '17' | |
}, | |
{ | |
regionName: '湖南', | |
regionId: '19' | |
}, | |
{ | |
regionName: '安徽', | |
regionId: '8' | |
}, | |
{ | |
regionName: '山东', | |
regionId: '27' | |
}, | |
{ | |
regionName: '新疆', | |
regionId: '32' | |
}, | |
{ | |
regionName: '江苏', | |
regionId: '21' | |
}, | |
{ | |
regionName: '浙江', | |
regionId: '34' | |
}, | |
{ | |
regionName: '江西', | |
regionId: '22' | |
}, | |
{ | |
regionName: '湖北', | |
regionId: '18' | |
}, | |
{ | |
regionName: '广西', | |
regionId: '12' | |
}, | |
{ | |
regionName: '甘肃', | |
regionId: '10' | |
}, | |
{ | |
regionName: '山西', | |
regionId: '28' | |
}, | |
{ | |
regionName: '内蒙古', | |
regionId: '24' | |
}, | |
{ | |
regionName: '陕西', | |
regionId: '29' | |
}, | |
{ | |
regionName: '吉林', | |
regionId: '20' | |
}, | |
{ | |
regionName: '福建', | |
regionId: '9' | |
}, | |
{ | |
regionName: '贵州', | |
regionId: '13' | |
}, | |
{ | |
regionName: '广东', | |
regionId: '11' | |
}, | |
{ | |
regionName: '青海', | |
regionId: '26' | |
}, | |
{ | |
regionName: '西藏', | |
regionId: '31' | |
}, | |
{ | |
regionName: '四川', | |
regionId: '30' | |
}, | |
{ | |
regionName: '宁夏', | |
regionId: '25' | |
}, | |
{ | |
regionName: '海南', | |
regionId: '14' | |
}, | |
{ | |
regionName: '台湾', | |
regionId: '7' | |
}, | |
{ | |
regionName: '香港', | |
regionId: '6' | |
}, | |
{ | |
regionName: '澳门', | |
regionId: '5' | |
}, | |
{ | |
regionName: '其他地域', | |
regionId: '9999' | |
} | |
]; | |
/** | |
* 控件类 | |
* | |
* @constructor | |
* @param {Object} options 初始化参数 | |
*/ | |
function RegionChart(options) { | |
Control.apply(this, arguments); | |
} | |
lib.inherits(RegionChart, Control); | |
RegionChart.prototype.type = 'RegionChart'; | |
/** | |
* 显示加载提示 | |
* | |
* @param {BaseChart} chart 类实例 | |
*/ | |
function showLoading(chart) { | |
var mask = chart.helper.getPart('loading-mask'); | |
chart.helper.addPartClasses('loading-mask-show', mask); | |
} | |
/** | |
* 隐藏加载提示 | |
* | |
* @param {BaseChart} chart 类实例 | |
*/ | |
function hideLoading(chart) { | |
var mask = chart.helper.getPart('loading-mask'); | |
chart.helper.removePartClasses('loading-mask-show', mask); | |
} | |
/** | |
* 绘制图表 | |
* | |
* @param {BaseChart} control 类实例 | |
*/ | |
function draw(control) { | |
if (!control.chartOptions.series) { | |
return; | |
} | |
showLoading(control); | |
// 画图表 | |
var chart = control.chart; | |
chart.setOption(control.chartOptions, true); | |
hideLoading(control); | |
} | |
RegionChart.prototype.initOptions = function (options) { | |
var mapSeries = { | |
name: '', | |
type: 'map', | |
mapType: 'china', | |
mapLocation: { | |
x: 'left' | |
}, | |
selectedMode: 'multiple', | |
itemStyle: { | |
normal: { | |
label: { show: true } | |
}, | |
emphasis: { | |
label: { show: true } | |
} | |
}, | |
data: [] | |
}; | |
var pieSeries = { | |
name: '', | |
type: 'pie', | |
tooltip: { | |
trigger: 'item', | |
formatter: '{a} <br/>{b} : {c} ({d}%)' | |
}, | |
radius: [50, 120], | |
data: [] | |
}; | |
var properties = { | |
tooltip: { | |
trigger: 'item' | |
}, | |
animation: false, | |
series: [ | |
mapSeries, | |
pieSeries | |
] | |
}; | |
this.chartOptions = properties; | |
var controlProperties = { | |
loadingText: '正在努力渲染...', | |
mapName: '', | |
mapData: [], | |
pieName: '', | |
pieData: [] | |
}; | |
lib.extend(controlProperties, options); | |
this.setProperties(controlProperties); | |
}; | |
RegionChart.prototype.initStructure = function () { | |
var tpl = [ | |
'<div class="${className}">', | |
'<div id="${chartId}"', | |
' style="height: 400px"', | |
' class="${chartMain}"></div>', | |
'<div id="${loadingMaskId}" style="line-height:250px;"', | |
' class="${loadingMask}">${loadingText}</div>', | |
'</div>' | |
]; | |
var chartId = this.helper.getId('main'); | |
var loadingMaskId = this.helper.getId('loading-mask'); | |
this.main.innerHTML = lib.format( | |
tpl.join('\n'), | |
{ | |
className: | |
this.helper.getPartClasses('frame').join(' '), | |
chartMain: | |
this.helper.getPartClasses('region-main').join(''), | |
chartId: chartId, | |
loadingMaskId: loadingMaskId, | |
loadingMask: | |
this.helper.getPartClasses('loading-mask').join(''), | |
loadingText: this.loadingText | |
} | |
); | |
var chart = echarts.init(lib.g(chartId)); | |
this.chart = chart; | |
// 绑定resize事件 | |
this.helper.addDOMEvent(window, 'resize', function () { | |
var pieSeries = this.chartOptions.series[1]; | |
var chartMain = lib.g(this.helper.getId('main')); | |
if (chartMain) { | |
var pieLeftPosition = getPieLeftPosition(chartMain.offsetWidth); | |
pieSeries.center = [pieLeftPosition, 200]; | |
chart.setOption(this.chartOptions, true); | |
} | |
chart.resize(); | |
}); | |
}; | |
var paint = require('esui/painters'); | |
/** | |
* 重新渲染视图 | |
* 仅当生命周期处于RENDER时,该方法才重新渲染 | |
* | |
* @param {Array=} 变更过的属性的集合 | |
* @override | |
*/ | |
RegionChart.prototype.repaint = paint.createRepaint( | |
Control.prototype.repaint, | |
{ | |
name: ['mapData', 'mapName', 'pieData', 'pieName'], | |
// pieName和mapName分别是mapData和pieData的提示名称,随着 | |
// data变化而变化 | |
paint: function (chart, mapData, mapName, pieData, pieName) { | |
if (!mapData || !pieData){ | |
return; | |
} | |
// 更新地图控件数据 | |
var mapSeries = chart.chartOptions.series[0]; | |
var pieSeries = chart.chartOptions.series[1]; | |
var isMapEqual = u.isEqual(mapSeries.data, mapData); | |
var isPieEqual = u.isEqual(pieSeries.data, pieData); | |
var isMapEmpty = mapData.length === 0; | |
var isPieEmpty = pieData.length === 0; | |
if (isMapEqual && isPieEqual | |
&& !isPieEmpty && !isMapEmpty) { | |
return; | |
} | |
if (u.isArray(pieData)) { | |
// 更新饼图数据 | |
pieSeries.data = chart.formatPieData(pieData); | |
pieSeries.name = pieName; | |
} | |
if (u.isArray(mapData)) { | |
//更新地图数据 | |
mapSeries.data = chart.formatMapData(mapData); | |
mapSeries.name = mapName; | |
} | |
var maxItem = u.max(mapData, function (item) { | |
return item.value; | |
}); | |
var minItem = u.min(mapData, function (item) { | |
return item.value; | |
}); | |
var max = maxItem.value; | |
var min = minItem.value; | |
var dataRange = { | |
orient: 'horizontal', | |
min: min, | |
max: max, | |
text: ['高', '低'], | |
splitNumber: 0 | |
}; | |
var chartMain = lib.g(chart.helper.getId('main')); | |
var pieLeftPosition = getPieLeftPosition(chartMain.offsetWidth); | |
pieSeries.center = [pieLeftPosition, 200]; | |
chart.chartOptions.dataRange = dataRange; | |
chart.chartOptions.series = [mapSeries, pieSeries]; | |
draw(chart); | |
} | |
} | |
); | |
// PIE左边距极限值。小于这个的话,就和地图重叠了。 | |
var LEFT_EXTREME_POSITION = 640; | |
// 容器宽度界定值。容器比这个大的话,可以放得更宽松。 | |
var WINDOW_WIDTH = 1200; | |
function getPieLeftPosition(mainWidth) { | |
var pieLeftPosition = mainWidth - (mainWidth > WINDOW_WIDTH ? 400 : 220); | |
if (pieLeftPosition < LEFT_EXTREME_POSITION) { | |
pieLeftPosition = LEFT_EXTREME_POSITION; | |
} | |
return pieLeftPosition; | |
} | |
RegionChart.prototype.formatMapData = function (mapData) { | |
var len = regionMap.length; | |
var mapLen = mapData.length; | |
var results = []; | |
for (var i = 0; i < len; i++) { | |
var regionInfo = regionMap[i]; | |
var regionId = regionInfo.regionId; | |
for (var j = mapLen - 1; j >= 0; j--) { | |
if (mapData[j].regionId == regionId) { | |
results.push({ | |
name: regionInfo.regionName, | |
value: mapData[j].value | |
}); | |
} | |
} | |
} | |
return results; | |
}; | |
RegionChart.prototype.formatPieData = function (pieData) { | |
var results = this.formatMapData(pieData); | |
return results; | |
}; | |
RegionChart.prototype.dispose = function () { | |
if (this.helper.isInStage('DISPOSED')) { | |
return; | |
} | |
if (this.chart) { | |
this.chart.dispose(); | |
this.chart = null; | |
} | |
Control.prototype.dispose.apply(this, arguments); | |
}; | |
require('esui').register(RegionChart); | |
return RegionChart; | |
} | |
); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment