123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225 |
- /*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
- /**
- * @module echarts/model/Model
- */
- import * as zrUtil from 'zrender/src/core/util';
- import env from 'zrender/src/core/env';
- import {makeInner} from '../util/model';
- import {enableClassExtend, enableClassCheck} from '../util/clazz';
- import lineStyleMixin from './mixin/lineStyle';
- import areaStyleMixin from './mixin/areaStyle';
- import textStyleMixin from './mixin/textStyle';
- import itemStyleMixin from './mixin/itemStyle';
- var mixin = zrUtil.mixin;
- var inner = makeInner();
- /**
- * @alias module:echarts/model/Model
- * @constructor
- * @param {Object} [option]
- * @param {module:echarts/model/Model} [parentModel]
- * @param {module:echarts/model/Global} [ecModel]
- */
- function Model(option, parentModel, ecModel) {
- /**
- * @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|Array.<string>} path
- * @param {boolean} [ignoreParent=false]
- * @return {*}
- */
- get: function (path, ignoreParent) {
- if (path == null) {
- return this.option;
- }
- return doGet(
- this.option,
- this.parsePath(path),
- !ignoreParent && getParent(this, path)
- );
- },
- /**
- * @param {string} key
- * @param {boolean} [ignoreParent=false]
- * @return {*}
- */
- getShallow: function (key, ignoreParent) {
- var option = this.option;
- var val = option == null ? option : option[key];
- var parentModel = !ignoreParent && getParent(this, key);
- if (val == null && parentModel) {
- val = parentModel.getShallow(key);
- }
- return val;
- },
- /**
- * @param {string|Array.<string>} [path]
- * @param {module:echarts/model/Model} [parentModel]
- * @return {module:echarts/model/Model}
- */
- getModel: function (path, parentModel) {
- var obj = path == null
- ? this.option
- : doGet(this.option, path = this.parsePath(path));
- var thisParentModel;
- parentModel = parentModel || (
- (thisParentModel = getParent(this, path))
- && thisParentModel.getModel(path)
- );
- return new Model(obj, parentModel, this.ecModel);
- },
- /**
- * 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);
- },
- // If path is null/undefined, return null/undefined.
- parsePath: function (path) {
- if (typeof path === 'string') {
- path = path.split('.');
- }
- return path;
- },
- /**
- * @param {Function} getParentMethod
- * param {Array.<string>|string} path
- * return {module:echarts/model/Model}
- */
- customizeGetParent: function (getParentMethod) {
- inner(this).getParent = getParentMethod;
- },
- isAnimationEnabled: function () {
- if (!env.node) {
- if (this.option.animation != null) {
- return !!this.option.animation;
- }
- else if (this.parentModel) {
- return this.parentModel.isAnimationEnabled();
- }
- }
- }
- };
- function doGet(obj, pathArr, parentModel) {
- for (var i = 0; i < pathArr.length; i++) {
- // Ignore empty
- if (!pathArr[i]) {
- continue;
- }
- // obj could be number/string/... (like 0)
- obj = (obj && typeof obj === 'object') ? obj[pathArr[i]] : null;
- if (obj == null) {
- break;
- }
- }
- if (obj == null && parentModel) {
- obj = parentModel.get(pathArr);
- }
- return obj;
- }
- // `path` can be null/undefined
- function getParent(model, path) {
- var getParentMethod = inner(model).getParent;
- return getParentMethod ? getParentMethod.call(model, path) : model.parentModel;
- }
- // Enable Model.extend.
- enableClassExtend(Model);
- enableClassCheck(Model);
- mixin(Model, lineStyleMixin);
- mixin(Model, areaStyleMixin);
- mixin(Model, textStyleMixin);
- mixin(Model, itemStyleMixin);
- export default Model;
|