You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@echarts.apache.org by GitBox <gi...@apache.org> on 2018/05/31 03:33:28 UTC

[GitHub] summerhll opened a new issue #8433: 对于图表类型切换magicType,源码是怎么实现的?

summerhll opened a new issue #8433: 对于图表类型切换magicType,源码是怎么实现的?
URL: https://github.com/apache/incubator-echarts/issues/8433
 
 
   <!--
   为了方便我们能够复现和修复 bug,请遵从下面的规范描述您的问题。
   -->
   
   
   ### One-line summary [问题简述]
   工作有涉及到echarts的图表类型切换内容,然后去看了下magicType相关源码,源码里面的内容重新设置newOption,并没有找到相关的echarts.setOption(newOption)的内容,请问源码中echarts.setOption(newOption)这部分在哪里?
   相关代码:
   `
   	    var zrUtil = __webpack_require__(4);
   
   	    function MagicType(model) {
   	        this.model = model;
   	    }
   
   	    MagicType.defaultOption = {
   	        show: true,
   	        type: [],
   	        // Icon group
   	        icon: {
   	            line: 'M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4',
   	            bar: 'M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7',
   	            stack: 'M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z', // jshint ignore:line
   	            tiled: 'M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z'
   	        },
   	        title: {
   	            line: '切换为折线图',
   	            bar: '切换为柱状图',
   	            stack: '切换为堆叠',
   	            tiled: '切换为平铺'
   	        },
   	        option: {},
   	        seriesIndex: {}
   	    };
   
   	    var proto = MagicType.prototype;
   
   	    proto.getIcons = function () {
   	        var model = this.model;
   	        var availableIcons = model.get('icon');
   	        var icons = {};
   	        zrUtil.each(model.get('type'), function (type) {
   	            if (availableIcons[type]) {
   	                icons[type] = availableIcons[type];
   	            }
   	        });
   	        return icons;
   	    };
   
   	    var seriesOptGenreator = {
   	        'line': function (seriesType, seriesId, seriesModel, model) {
   	            if (seriesType === 'bar') {
   	                return zrUtil.merge({
   	                    id: seriesId,
   	                    type: 'line',
   	                    // Preserve data related option
   	                    data: seriesModel.get('data'),
   	                    stack: seriesModel.get('stack'),
   	                    markPoint: seriesModel.get('markPoint'),
   	                    markLine: seriesModel.get('markLine')
   	                }, model.get('option.line') || {}, true);
   	            }
   	        },
   	        'bar': function (seriesType, seriesId, seriesModel, model) {
   	            if (seriesType === 'line') {
   	                return zrUtil.merge({
   	                    id: seriesId,
   	                    type: 'bar',
   	                    // Preserve data related option
   	                    data: seriesModel.get('data'),
   	                    stack: seriesModel.get('stack'),
   	                    markPoint: seriesModel.get('markPoint'),
   	                    markLine: seriesModel.get('markLine')
   	                }, model.get('option.bar') || {}, true);
   	            }
   	        },
   	        'stack': function (seriesType, seriesId, seriesModel, model) {
   	            if (seriesType === 'line' || seriesType === 'bar') {
   	                return zrUtil.merge({
   	                    id: seriesId,
   	                    stack: '__ec_magicType_stack__'
   	                }, model.get('option.stack') || {}, true);
   	            }
   	        },
   	        'tiled': function (seriesType, seriesId, seriesModel, model) {
   	            if (seriesType === 'line' || seriesType === 'bar') {
   	                return zrUtil.merge({
   	                    id: seriesId,
   	                    stack: ''
   	                }, model.get('option.tiled') || {}, true);
   	            }
   	        }
   	    };
   
   	    var radioTypes = [
   	        ['line', 'bar'],
   	        ['stack', 'tiled']
   	    ];
   
   	    proto.onclick = function (ecModel, api, type) {
   	        var model = this.model;
   	        var seriesIndex = model.get('seriesIndex.' + type);
   	        // Not supported magicType
   	        if (!seriesOptGenreator[type]) {
   	            return;
   	        }
   	        var newOption = {
   	            series: []
   	        };
   	        var generateNewSeriesTypes = function (seriesModel) {
   	            var seriesType = seriesModel.subType;
   	            var seriesId = seriesModel.id;
   	            var newSeriesOpt = seriesOptGenreator[type](
   	                seriesType, seriesId, seriesModel, model
   	            );
   	            if (newSeriesOpt) {
   	                // PENDING If merge original option?
   	                zrUtil.defaults(newSeriesOpt, seriesModel.option);
   	                newOption.series.push(newSeriesOpt);
   	            }
   	            // Modify boundaryGap
   	            var coordSys = seriesModel.coordinateSystem;
   	            if (coordSys && coordSys.type === 'cartesian2d' && (type === 'line' || type === 'bar')) {
   	                var categoryAxis = coordSys.getAxesByScale('ordinal')[0];
   	                if (categoryAxis) {
   	                    var axisDim = categoryAxis.dim;
   	                    var axisType = axisDim + 'Axis';
   	                    var axisModel = ecModel.queryComponents({
   	                        mainType: axisType,
   	                        index: seriesModel.get(name + 'Index'),
   	                        id: seriesModel.get(name + 'Id')
   	                    })[0];
   	                    var axisIndex = axisModel.componentIndex;
   
   	                    newOption[axisType] = newOption[axisType] || [];
   	                    for (var i = 0; i <= axisIndex; i++) {
   	                        newOption[axisType][axisIndex] = newOption[axisType][axisIndex] || {};
   	                    }
   	                    newOption[axisType][axisIndex].boundaryGap = type === 'bar' ? true : false;
   	                }
   	            }
   	        };
   
   	        zrUtil.each(radioTypes, function (radio) {
   	            if (zrUtil.indexOf(radio, type) >= 0) {
   	                zrUtil.each(radio, function (item) {
   	                    model.setIconStatus(item, 'normal');
   	                });
   	            }
   	        });
   
   	        model.setIconStatus(type, 'emphasis');
   
   	        ecModel.eachComponent(
   	            {
   	                mainType: 'series',
   	                query: seriesIndex == null ? null : {
   	                    seriesIndex: seriesIndex
   	                }
   	            }, generateNewSeriesTypes
   	        );
   	        api.dispatchAction({
   	            type: 'changeMagicType',
   	            currentType: type,
   	            newOption: newOption
   	        });
   	    };
   
   	    var echarts = __webpack_require__(1);
   	    echarts.registerAction({
   	        type: 'changeMagicType',
   	        event: 'magicTypeChanged',
   	        update: 'prepareAndUpdate'
   	    }, function (payload, ecModel) {
   	        ecModel.mergeOption(payload.newOption);
   	    });
   
   	    __webpack_require__(314).register('magicType', MagicType);
   
   	    module.exports = MagicType;`
   
   
   
   
   ### Version & Environment [版本及环境]
   + ECharts version [ECharts 版本]:
   + Browser version [浏览器类型和版本]:
   + OS Version [操作系统类型和版本]:
   
   
   
   
   
   ### Expected behaviour [期望结果]
   
   
   
   
   
   ### ECharts option [ECharts配置项]
   <!-- Copy and paste your 'echarts option' here. -->
   <!-- [下方贴你的option,注意不要删掉下方 ```javascript 和 尾部的 ``` 字样。最好是我们能够直接运行的 option。如何得到能运行的 option 参见上方的 guidelines for contributing] -->
   ```javascript
   option = {
   
   }
   
   ```
   
   
   
   
   ### Other comments [其他信息]
   <!-- For example: Screenshot or Online demo -->
   <!-- [例如,截图或线上实例 (JSFiddle/JSBin/Codepen)] -->
   
   

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@echarts.apache.org
For additional commands, e-mail: dev-help@echarts.apache.org