Global.js 6.7 KB
Newer Older
L
lang 已提交
1 2 3 4 5 6
/**
 * ECharts global model
 *
 * @module {echarts/model/Global}
 */

L
lang 已提交
7 8 9 10 11
define(function (require) {

    var zrUtil = require('zrender/core/util');
    var Model = require('./Model');

L
lang 已提交
12 13
    var SeriesModel = require('./Series');
    var ComponentModel = require('./Component');
L
lang 已提交
14

L
lang 已提交
15 16
    var globalDefault = require('./globalDefault');

L
lang 已提交
17 18
    /**
     * @alias module:echarts/model/Global
L
lang 已提交
19 20 21 22
     *
     * @param {Object} option
     * @param {module:echarts/model/Model} parentModel
     * @param {Object} theme
L
lang 已提交
23
     */
L
lang 已提交
24 25 26 27
    var GlobalModel = Model.extend({

        constructor: GlobalModel,

L
lang 已提交
28
        init: function (option, parentModel, theme) {
L
lang 已提交
29

L
lang 已提交
30 31
            theme = theme || {};

L
lang 已提交
32 33 34 35 36 37
            this.option = {};

            /**
             * @type {Object.<string, module:echarts/model/Model>}
             * @private
             */
L
lang 已提交
38 39
            this._components = {};

L
lang 已提交
40 41 42 43
            /**
             * @type {Array.<module:echarts/model/Model}
             * @private
             */
L
lang 已提交
44 45
            this._series = [];

L
lang 已提交
46 47 48 49
            /**
             * @type {Object.<string, module:echarts/model/Model>}
             * @private
             */
L
lang 已提交
50 51
            this._seriesMap = {};

L
lang 已提交
52 53 54 55
            /**
             * @type {module:echarts/model/Model}
             * @private
             */
L
lang 已提交
56
            this._theme = new Model(theme);
L
lang 已提交
57

L
lang 已提交
58 59
            this._mergeTheme(option, theme);

L
lang 已提交
60
            // TODO Needs clone when merging to the unexisted property
L
lang 已提交
61 62
            zrUtil.merge(option, globalDefault, false);

L
lang 已提交
63 64 65
            this.mergeOption(option);
        },

L
lang 已提交
66 67 68 69 70 71 72 73
        /**
         * @private
         */
        _mergeTheme: function (option, theme) {
            for (var name in theme) {
                // 如果有 component model 则把具体的 merge 逻辑交给该 model 处理
                if (! ComponentModel.has[name]) {
                    if (typeof theme[name] === 'object') {
L
lang 已提交
74 75 76
                        option[name] = option[name]
                            ? zrUtil.clone(theme[name])
                            : zrUtil.merge(option[name], theme[name]);
L
lang 已提交
77 78 79 80 81 82 83 84 85 86 87
                    }
                    else {
                        option[name] = theme[name];
                    }
                }
            }
        },

        /**
         * @protected
         */
L
lang 已提交
88
        mergeOption: function (newOption) {
L
lang 已提交
89 90 91 92 93 94 95

            var option = this.option;

            zrUtil.each(newOption.series, function (series, idx) {
                var seriesName = series.name || (series.type + idx);
                var seriesMap = this._seriesMap;
                var seriesModel = seriesMap[seriesName];
L
lang 已提交
96 97 98 99
                if (seriesModel) {
                    seriesModel.mergeOption(series);
                }
                else {
L
lang 已提交
100 101 102
                    seriesModel = SeriesModel.create(series, this, idx);
                    seriesModel.name = seriesName;
                    seriesMap[seriesName] = seriesModel;
L
lang 已提交
103 104 105 106 107
                    this._series.push(seriesModel);
                }
            }, this);

            // 同步 Option
L
lang 已提交
108 109
            option.series = this._series.map(function (seriesModel) {
                return seriesModel.option;
L
lang 已提交
110 111
            });

L
lang 已提交
112
            var components = this._components;
L
lang 已提交
113
            for (var name in newOption) {
L
lang 已提交
114
                var componentOption = newOption[name];
L
lang 已提交
115
                // 如果不存在对应的 component model 则直接 merge
L
lang 已提交
116
                if (! ComponentModel.has(name)) {
L
lang 已提交
117
                    if (typeof componentOption === 'object') {
L
lang 已提交
118 119 120
                        option[name] = option[name] == null
                            ? zrUtil.clone(componentOption)
                            : zrUtil.merge(option[name], componentOption);
L
lang 已提交
121 122
                    }
                    else {
L
lang 已提交
123
                        option[name] = componentOption;
L
lang 已提交
124
                    }
L
lang 已提交
125 126
                }
                else {
L
lang 已提交
127 128 129 130 131 132 133
                    // Normalize
                    if (! (componentOption instanceof Array)) {
                        componentOption = [componentOption];
                    }
                    if (! components[name]) {
                        components[name] = [];
                    }
L
lang 已提交
134 135 136
                    for (var i = 0; i < componentOption.length; i++) {
                        var componentModel = components[name][i];
                        if (componentModel) {
L
lang 已提交
137 138 139
                            componentModel.mergeOption(
                                componentOption[i], this
                            );
L
lang 已提交
140 141
                        }
                        else {
L
lang 已提交
142 143 144
                            componentModel = ComponentModel.create(
                                name, componentOption[i], this
                            );
L
lang 已提交
145
                            components[name][i] = componentModel;
L
lang 已提交
146 147 148 149 150 151 152 153 154
                        }
                        if (componentModel) {
                            // 同步 Option
                            if (componentOption instanceof Array) {
                                option[name] = option[name] || [];
                                option[name][i] = componentModel.option;
                            }
                            else {
                                option[name] = componentModel.option;
L
lang 已提交
155 156
                            }
                        }
L
lang 已提交
157 158 159 160 161
                    }
                }
            }
        },

L
lang 已提交
162 163 164
        /**
         * @return {module:echarts/model/Model}
         */
L
lang 已提交
165 166 167 168
        getTheme: function () {
            return this._theme;
        },

L
lang 已提交
169 170 171
        /**
         * @return {module:echarts/model/Component}
         */
L
lang 已提交
172 173 174 175 176 177 178 179 180
        getComponent: function (type, idx) {
            var list = this._components[type];
            if (list) {
                return list[idx || 0];
            }
        },

        eachComponent: function (type, cb, context) {
            zrUtil.each(this._components[type], cb, context);
L
lang 已提交
181 182 183 184 185 186
        },

        getSeriesByName: function (name) {
            return this._seriesMap[name];
        },

L
lang 已提交
187 188 189 190
        /**
         * @param {string} type
         * @return {Array.<module:echarts/model/Series>}
         */
L
lang 已提交
191 192 193 194 195 196
        getSeriesByType: function (type) {
            return zrUtil.filter(this._series, function (series) {
                return series.type === type;
            });
        },

L
lang 已提交
197 198 199 200 201
        /**
         * @param {number} seriesIndex
         * @return {module:echarts/model/Series}
         */
        getSeries: function (seriesIndex) {
L
lang 已提交
202 203 204
            return this._series[seriesIndex];
        },

L
lang 已提交
205 206 207 208 209 210 211
        /**
         * @return {Array.<module:echarts/model/Series>}
         */
        getSeriesAll: function () {
            return this._series;
        },

L
lang 已提交
212 213 214 215 216 217 218 219 220 221 222
        eachSeries: function (cb, context) {
            zrUtil.each(this._series, cb, context);
        },

        filterSeries: function (cb, context) {
            this._series = zrUtil.filter(this._series, cb, context);
        }
    });

    return GlobalModel;
});