Global.js 8.4 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
            this.option = {};

L
lang 已提交
34 35 36 37 38 39 40 41 42 43 44 45
            /**
             * @type {Array}
             * @private
             */
            this._stack = [];

            /**
             * @type {Array.<module:echarts/model/Model}
             * @private
             */
            this._components = [];

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

L
lang 已提交
52 53 54 55
            /**
             * @type {Array.<module:echarts/model/Model}
             * @private
             */
L
lang 已提交
56 57
            this._series = [];

L
lang 已提交
58 59 60 61
            /**
             * @type {Object.<string, module:echarts/model/Model>}
             * @private
             */
L
lang 已提交
62 63
            this._seriesMap = {};

L
lang 已提交
64 65 66 67
            /**
             * @type {module:echarts/model/Model}
             * @private
             */
L
lang 已提交
68
            this._theme = new Model(theme);
L
lang 已提交
69

L
lang 已提交
70 71
            this._mergeTheme(option, theme);

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

L
lang 已提交
75 76 77
            this.mergeOption(option);
        },

L
lang 已提交
78 79 80 81 82 83 84 85
        /**
         * @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 已提交
86 87 88
                        option[name] = option[name]
                            ? zrUtil.clone(theme[name])
                            : zrUtil.merge(option[name], theme[name]);
L
lang 已提交
89 90 91 92 93 94 95 96 97 98 99
                    }
                    else {
                        option[name] = theme[name];
                    }
                }
            }
        },

        /**
         * @protected
         */
L
lang 已提交
100
        mergeOption: function (newOption) {
L
lang 已提交
101 102 103 104 105 106 107

            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 已提交
108
                if (seriesModel) {
L
lang 已提交
109
                    seriesModel.mergeOption(series, this);
L
lang 已提交
110 111
                }
                else {
L
lang 已提交
112 113 114
                    seriesModel = SeriesModel.create(series, this, idx);
                    seriesModel.name = seriesName;
                    seriesMap[seriesName] = seriesModel;
L
lang 已提交
115 116 117 118 119
                    this._series.push(seriesModel);
                }
            }, this);

            // 同步 Option
L
lang 已提交
120 121
            option.series = this._series.map(function (seriesModel) {
                return seriesModel.option;
L
lang 已提交
122 123
            });

L
lang 已提交
124
            var componentsMap = this._componentsMap;
L
lang 已提交
125
            var components = this._components;
L
lang 已提交
126
            for (var name in newOption) {
L
lang 已提交
127
                var componentOption = newOption[name];
L
lang 已提交
128
                // 如果不存在对应的 component model 则直接 merge
L
lang 已提交
129
                if (! ComponentModel.has(name)) {
L
lang 已提交
130
                    if (typeof componentOption === 'object') {
L
lang 已提交
131 132 133
                        option[name] = option[name] == null
                            ? zrUtil.clone(componentOption)
                            : zrUtil.merge(option[name], componentOption);
L
lang 已提交
134 135
                    }
                    else {
L
lang 已提交
136
                        option[name] = componentOption;
L
lang 已提交
137
                    }
L
lang 已提交
138 139
                }
                else {
L
lang 已提交
140 141 142 143
                    // Normalize
                    if (! (componentOption instanceof Array)) {
                        componentOption = [componentOption];
                    }
L
lang 已提交
144 145
                    if (! componentsMap[name]) {
                        componentsMap[name] = [];
L
lang 已提交
146
                    }
L
lang 已提交
147
                    for (var i = 0; i < componentOption.length; i++) {
L
lang 已提交
148
                        var componentModel = componentsMap[name][i];
L
lang 已提交
149
                        if (componentModel) {
L
lang 已提交
150 151 152
                            componentModel.mergeOption(
                                componentOption[i], this
                            );
L
lang 已提交
153 154
                        }
                        else {
L
lang 已提交
155 156 157
                            componentModel = ComponentModel.create(
                                name, componentOption[i], this
                            );
L
lang 已提交
158 159
                            componentsMap[name][i] = componentModel;
                            components.push(componentModel);
L
lang 已提交
160 161 162 163 164 165 166 167 168
                        }
                        if (componentModel) {
                            // 同步 Option
                            if (componentOption instanceof Array) {
                                option[name] = option[name] || [];
                                option[name][i] = componentModel.option;
                            }
                            else {
                                option[name] = componentModel.option;
L
lang 已提交
169 170
                            }
                        }
L
lang 已提交
171 172 173 174 175
                    }
                }
            }
        },

L
lang 已提交
176 177 178
        /**
         * @return {module:echarts/model/Model}
         */
L
lang 已提交
179 180 181 182
        getTheme: function () {
            return this._theme;
        },

L
lang 已提交
183 184 185
        /**
         * @return {module:echarts/model/Component}
         */
L
lang 已提交
186
        getComponent: function (type, idx) {
L
lang 已提交
187
            var list = this._componentsMap[type];
L
lang 已提交
188 189 190 191 192
            if (list) {
                return list[idx || 0];
            }
        },

L
lang 已提交
193 194 195 196 197
        /**
         * @param {string} type
         * @param {Function} cb
         * @param {*} context
         */
L
lang 已提交
198
        eachComponent: function (type, cb, context) {
L
lang 已提交
199
            zrUtil.each(this._componentsMap[type], cb, context);
L
lang 已提交
200 201
        },

L
lang 已提交
202 203 204 205
        /**
         * @param {string} name
         * @return {Array.<module:echarts/model/Series>}
         */
L
lang 已提交
206 207 208 209
        getSeriesByName: function (name) {
            return this._seriesMap[name];
        },

L
lang 已提交
210 211 212 213
        /**
         * @param {string} type
         * @return {Array.<module:echarts/model/Series>}
         */
L
lang 已提交
214 215 216 217 218 219
        getSeriesByType: function (type) {
            return zrUtil.filter(this._series, function (series) {
                return series.type === type;
            });
        },

L
lang 已提交
220 221 222 223 224
        /**
         * @param {number} seriesIndex
         * @return {module:echarts/model/Series}
         */
        getSeries: function (seriesIndex) {
L
lang 已提交
225 226 227
            return this._series[seriesIndex];
        },

L
lang 已提交
228 229 230 231
        /**
         * @return {Array.<module:echarts/model/Series>}
         */
        getSeriesAll: function () {
L
lang 已提交
232
            return this._series.slice();
L
lang 已提交
233 234
        },

L
lang 已提交
235 236 237 238
        /**
         * @param {Function} cb
         * @param {*} context
         */
L
lang 已提交
239 240 241 242
        eachSeries: function (cb, context) {
            zrUtil.each(this._series, cb, context);
        },

L
lang 已提交
243 244 245 246
        /**
         * @param {Function} cb
         * @param {*} context
         */
L
lang 已提交
247 248
        filterSeries: function (cb, context) {
            this._series = zrUtil.filter(this._series, cb, context);
L
lang 已提交
249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280
        },

        save: function () {
            this._stack.push({
                series: this._series.slice()
            });

            var components = this._components;
            var series = this._series;
            var i;
            for (i = 0; i < components.length; i++) {
                components[i].save();
            }
            for (i = 0; i < series.length; i++) {
                series[i].save();
            }
        },

        restore: function () {
            if (this._stack.length) {
                this._series = this._stack.pop().series;
            }

            var components = this._components;
            var series = this._series;
            var i;
            for (i = 0; i < components.length; i++) {
                components[i].restore();
            }
            for (i = 0; i < series.length; i++) {
                series[i].restore();
            }
L
lang 已提交
281 282 283 284 285
        }
    });

    return GlobalModel;
});