| /** |
| * @module echarts/model/Model |
| */ |
| define(function (require) { |
| |
| var zrUtil = require('zrender/core/util'); |
| var clazzUtil = require('../util/clazz'); |
| |
| /** |
| * @alias module:echarts/model/Model |
| * @constructor |
| * @param {Object} option |
| * @param {module:echarts/model/Model} [parentModel] |
| * @param {module:echarts/model/Global} [ecModel] |
| * @param {Object} extraOpt |
| */ |
| function Model(option, parentModel, ecModel, extraOpt) { |
| /** |
| * @type {module:echarts/model/Model} |
| * @readOnly |
| */ |
| this.parentModel = parentModel; |
| |
| /** |
| * @type {module:echarts/model/Global} |
| * @readOnly |
| */ |
| this.ecModel = ecModel; |
| |
| /** |
| * @type {Object} |
| * @protected |
| */ |
| this.option = option; |
| |
| // Simple optimization |
| if (this.init) { |
| if (arguments.length <= 4) { |
| this.init(option, parentModel, ecModel, extraOpt); |
| } |
| else { |
| this.init.apply(this, arguments); |
| } |
| } |
| } |
| |
| Model.prototype = { |
| |
| constructor: Model, |
| |
| /** |
| * Model 的初始化函数 |
| * @param {Object} option |
| */ |
| init: null, |
| |
| /** |
| * 从新的 Option merge |
| */ |
| mergeOption: function (option) { |
| zrUtil.merge(this.option, option, true); |
| }, |
| |
| /** |
| * @param {string} path |
| * @param {boolean} [ignoreParent=false] |
| * @return {*} |
| */ |
| get: function (path, ignoreParent) { |
| if (!path) { |
| return this.option; |
| } |
| |
| if (typeof path === 'string') { |
| path = path.split('.'); |
| } |
| |
| var obj = this.option; |
| var parentModel = this.parentModel; |
| for (var i = 0; i < path.length; i++) { |
| // Ignore empty |
| if (!path[i]) { |
| continue; |
| } |
| // obj could be number/string/... (like 0) |
| obj = (obj && typeof obj === 'object') ? obj[path[i]] : null; |
| if (obj == null) { |
| break; |
| } |
| } |
| if (obj == null && parentModel && !ignoreParent) { |
| obj = parentModel.get(path); |
| } |
| return obj; |
| }, |
| |
| /** |
| * @param {string} key |
| * @param {boolean} [ignoreParent=false] |
| * @return {*} |
| */ |
| getShallow: function (key, ignoreParent) { |
| var option = this.option; |
| var val = option && option[key]; |
| var parentModel = this.parentModel; |
| if (val == null && parentModel && !ignoreParent) { |
| val = parentModel.getShallow(key); |
| } |
| return val; |
| }, |
| |
| /** |
| * @param {string} path |
| * @param {module:echarts/model/Model} [parentModel] |
| * @return {module:echarts/model/Model} |
| */ |
| getModel: function (path, parentModel) { |
| var obj = this.get(path, true); |
| var thisParentModel = this.parentModel; |
| var model = new Model( |
| obj, parentModel || (thisParentModel && thisParentModel.getModel(path)), |
| this.ecModel |
| ); |
| return model; |
| }, |
| |
| /** |
| * If model has option |
| */ |
| isEmpty: function () { |
| return this.option == null; |
| }, |
| |
| restoreData: function () {}, |
| |
| // Pending |
| clone: function () { |
| var Ctor = this.constructor; |
| return new Ctor(zrUtil.clone(this.option)); |
| }, |
| |
| setReadOnly: function (properties) { |
| clazzUtil.setReadOnly(this, properties); |
| } |
| }; |
| |
| // Enable Model.extend. |
| clazzUtil.enableClassExtend(Model); |
| |
| var mixin = zrUtil.mixin; |
| mixin(Model, require('./mixin/lineStyle')); |
| mixin(Model, require('./mixin/areaStyle')); |
| mixin(Model, require('./mixin/textStyle')); |
| mixin(Model, require('./mixin/itemStyle')); |
| |
| return Model; |
| }); |