derived-series.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. 'use strict';
  2. import H from '../parts/Globals.js';
  3. import '../parts/Series.js';
  4. var Series = H.Series,
  5. addEvent = H.addEvent,
  6. noop = H.noop;
  7. /* ************************************************************************** *
  8. *
  9. * DERIVED SERIES MIXIN
  10. *
  11. * ************************************************************************** */
  12. /**
  13. * Provides methods for auto setting/updating series data based on the based
  14. * series data.
  15. *
  16. * @private
  17. * @mixin derivedSeriesMixin
  18. */
  19. var derivedSeriesMixin = {
  20. /**
  21. * Initialise series
  22. *
  23. * @private
  24. * @function derivedSeriesMixin.init
  25. */
  26. init: function () {
  27. Series.prototype.init.apply(this, arguments);
  28. this.initialised = false;
  29. this.baseSeries = null;
  30. this.eventRemovers = [];
  31. this.addEvents();
  32. },
  33. /**
  34. * Method to be implemented - inside the method the series has already
  35. * access to the base series via m `this.baseSeries` and the bases data is
  36. * initialised. It should return data in the format accepted by
  37. * `Series.setData()` method
  38. *
  39. * @private
  40. * @function derivedSeriesMixin.setDerivedData
  41. *
  42. * @return {Array<*>}
  43. * An array of data
  44. */
  45. setDerivedData: noop,
  46. /**
  47. * Sets base series for the series
  48. *
  49. * @private
  50. * @function derivedSeriesMixin.setBaseSeries
  51. */
  52. setBaseSeries: function () {
  53. var chart = this.chart,
  54. baseSeriesOptions = this.options.baseSeries,
  55. baseSeries =
  56. baseSeriesOptions &&
  57. (chart.series[baseSeriesOptions] || chart.get(baseSeriesOptions));
  58. this.baseSeries = baseSeries || null;
  59. },
  60. /**
  61. * Adds events for the series
  62. *
  63. * @private
  64. * @function derivedSeriesMixin.addEvents
  65. */
  66. addEvents: function () {
  67. var derivedSeries = this,
  68. chartSeriesLinked;
  69. chartSeriesLinked = addEvent(
  70. this.chart,
  71. 'afterLinkSeries',
  72. function () {
  73. derivedSeries.setBaseSeries();
  74. if (derivedSeries.baseSeries && !derivedSeries.initialised) {
  75. derivedSeries.setDerivedData();
  76. derivedSeries.addBaseSeriesEvents();
  77. derivedSeries.initialised = true;
  78. }
  79. }
  80. );
  81. this.eventRemovers.push(
  82. chartSeriesLinked
  83. );
  84. },
  85. /**
  86. * Adds events to the base series - it required for recalculating the data
  87. * in the series if the base series is updated / removed / etc.
  88. *
  89. * @private
  90. * @function derivedSeriesMixin.addBaseSeriesEvents
  91. */
  92. addBaseSeriesEvents: function () {
  93. var derivedSeries = this,
  94. updatedDataRemover,
  95. destroyRemover;
  96. updatedDataRemover = addEvent(
  97. derivedSeries.baseSeries,
  98. 'updatedData',
  99. function () {
  100. derivedSeries.setDerivedData();
  101. }
  102. );
  103. destroyRemover = addEvent(
  104. derivedSeries.baseSeries,
  105. 'destroy',
  106. function () {
  107. derivedSeries.baseSeries = null;
  108. derivedSeries.initialised = false;
  109. }
  110. );
  111. derivedSeries.eventRemovers.push(
  112. updatedDataRemover,
  113. destroyRemover
  114. );
  115. },
  116. /**
  117. * Destroys the series
  118. *
  119. * @private
  120. * @function derivedSeriesMixin.destroy
  121. */
  122. destroy: function () {
  123. this.eventRemovers.forEach(function (remover) {
  124. remover();
  125. });
  126. Series.prototype.destroy.apply(this, arguments);
  127. }
  128. };
  129. export default derivedSeriesMixin;