Component.js 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. var zrUtil = require("zrender/lib/core/util");
  2. var Model = require("./Model");
  3. var componentUtil = require("../util/component");
  4. var clazzUtil = require("../util/clazz");
  5. var layout = require("../util/layout");
  6. var boxLayoutMixin = require("./mixin/boxLayout");
  7. /**
  8. * Component model
  9. *
  10. * @module echarts/model/Component
  11. */
  12. var arrayPush = Array.prototype.push;
  13. /**
  14. * @alias module:echarts/model/Component
  15. * @constructor
  16. * @param {Object} option
  17. * @param {module:echarts/model/Model} parentModel
  18. * @param {module:echarts/model/Model} ecModel
  19. */
  20. var ComponentModel = Model.extend({
  21. type: 'component',
  22. /**
  23. * @readOnly
  24. * @type {string}
  25. */
  26. id: '',
  27. /**
  28. * @readOnly
  29. */
  30. name: '',
  31. /**
  32. * @readOnly
  33. * @type {string}
  34. */
  35. mainType: '',
  36. /**
  37. * @readOnly
  38. * @type {string}
  39. */
  40. subType: '',
  41. /**
  42. * @readOnly
  43. * @type {number}
  44. */
  45. componentIndex: 0,
  46. /**
  47. * @type {Object}
  48. * @protected
  49. */
  50. defaultOption: null,
  51. /**
  52. * @type {module:echarts/model/Global}
  53. * @readOnly
  54. */
  55. ecModel: null,
  56. /**
  57. * key: componentType
  58. * value: Component model list, can not be null.
  59. * @type {Object.<string, Array.<module:echarts/model/Model>>}
  60. * @readOnly
  61. */
  62. dependentModels: [],
  63. /**
  64. * @type {string}
  65. * @readOnly
  66. */
  67. uid: null,
  68. /**
  69. * Support merge layout params.
  70. * Only support 'box' now (left/right/top/bottom/width/height).
  71. * @type {string|Object} Object can be {ignoreSize: true}
  72. * @readOnly
  73. */
  74. layoutMode: null,
  75. $constructor: function (option, parentModel, ecModel, extraOpt) {
  76. Model.call(this, option, parentModel, ecModel, extraOpt);
  77. this.uid = componentUtil.getUID('componentModel');
  78. },
  79. init: function (option, parentModel, ecModel, extraOpt) {
  80. this.mergeDefaultAndTheme(option, ecModel);
  81. },
  82. mergeDefaultAndTheme: function (option, ecModel) {
  83. var layoutMode = this.layoutMode;
  84. var inputPositionParams = layoutMode ? layout.getLayoutParams(option) : {};
  85. var themeModel = ecModel.getTheme();
  86. zrUtil.merge(option, themeModel.get(this.mainType));
  87. zrUtil.merge(option, this.getDefaultOption());
  88. if (layoutMode) {
  89. layout.mergeLayoutParam(option, inputPositionParams, layoutMode);
  90. }
  91. },
  92. mergeOption: function (option, extraOpt) {
  93. zrUtil.merge(this.option, option, true);
  94. var layoutMode = this.layoutMode;
  95. if (layoutMode) {
  96. layout.mergeLayoutParam(this.option, option, layoutMode);
  97. }
  98. },
  99. // Hooker after init or mergeOption
  100. optionUpdated: function (newCptOption, isInit) {},
  101. getDefaultOption: function () {
  102. if (!clazzUtil.hasOwn(this, '__defaultOption')) {
  103. var optList = [];
  104. var Class = this.constructor;
  105. while (Class) {
  106. var opt = Class.prototype.defaultOption;
  107. opt && optList.push(opt);
  108. Class = Class.superClass;
  109. }
  110. var defaultOption = {};
  111. for (var i = optList.length - 1; i >= 0; i--) {
  112. defaultOption = zrUtil.merge(defaultOption, optList[i], true);
  113. }
  114. clazzUtil.set(this, '__defaultOption', defaultOption);
  115. }
  116. return clazzUtil.get(this, '__defaultOption');
  117. },
  118. getReferringComponents: function (mainType) {
  119. return this.ecModel.queryComponents({
  120. mainType: mainType,
  121. index: this.get(mainType + 'Index', true),
  122. id: this.get(mainType + 'Id', true)
  123. });
  124. }
  125. }); // Reset ComponentModel.extend, add preConstruct.
  126. // clazzUtil.enableClassExtend(
  127. // ComponentModel,
  128. // function (option, parentModel, ecModel, extraOpt) {
  129. // // Set dependentModels, componentIndex, name, id, mainType, subType.
  130. // zrUtil.extend(this, extraOpt);
  131. // this.uid = componentUtil.getUID('componentModel');
  132. // // this.setReadOnly([
  133. // // 'type', 'id', 'uid', 'name', 'mainType', 'subType',
  134. // // 'dependentModels', 'componentIndex'
  135. // // ]);
  136. // }
  137. // );
  138. // Add capability of registerClass, getClass, hasClass, registerSubTypeDefaulter and so on.
  139. clazzUtil.enableClassManagement(ComponentModel, {
  140. registerWhenExtend: true
  141. });
  142. componentUtil.enableSubTypeDefaulter(ComponentModel); // Add capability of ComponentModel.topologicalTravel.
  143. componentUtil.enableTopologicalTravel(ComponentModel, getDependencies);
  144. function getDependencies(componentType) {
  145. var deps = [];
  146. zrUtil.each(ComponentModel.getClassesByMainType(componentType), function (Clazz) {
  147. arrayPush.apply(deps, Clazz.prototype.dependencies || []);
  148. }); // Ensure main type
  149. return zrUtil.map(deps, function (type) {
  150. return clazzUtil.parseClassType(type).main;
  151. });
  152. }
  153. zrUtil.mixin(ComponentModel, boxLayoutMixin);
  154. var _default = ComponentModel;
  155. module.exports = _default;