index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /**
  2. * The component for handling all slides including clones.
  3. *
  4. * @author Naotoshi Fujita
  5. * @copyright Naotoshi Fujita. All rights reserved.
  6. */
  7. import Slide from './slide';
  8. /**
  9. * The component for handling all slides including clones.
  10. *
  11. * @param {Splide} Splide - A Splide instance.
  12. * @param {Object} Components - An object containing components.
  13. *
  14. * @return {Object} - The component object.
  15. */
  16. export default ( Splide, Components ) => {
  17. /**
  18. * Store slide elements.
  19. *
  20. * @type {Array}
  21. */
  22. let slides = [];
  23. /**
  24. * Store Slide objects.
  25. *
  26. * @type {Array}
  27. */
  28. let SlideObjects = [];
  29. /**
  30. * Slides component object.
  31. *
  32. * @type {Object}
  33. */
  34. const Slides = {
  35. /**
  36. * Called when the component is mounted.
  37. */
  38. mount() {
  39. init();
  40. Splide.on( 'refresh', () => {
  41. this.destroy();
  42. init();
  43. } );
  44. },
  45. /**
  46. * Destroy.
  47. */
  48. destroy() {
  49. SlideObjects.forEach( Slide => { Slide.destroy() } );
  50. SlideObjects = [];
  51. },
  52. /**
  53. * Register a slide to create a Slide object and handle its behavior.
  54. *
  55. * @param {number} index - A unique index.
  56. * @param {number} realIndex - A real index for clones. Set -1 for real slides.
  57. * @param {Element} slide - A slide element.
  58. */
  59. register( index, realIndex, slide ) {
  60. const SlideObject = Slide( index, realIndex, slide, Splide );
  61. SlideObject.mount();
  62. SlideObjects.push( SlideObject );
  63. },
  64. /**
  65. * Return the Slide object designated by the index.
  66. * Note that "find" is not supported by IE.
  67. *
  68. * @return {Object|undefined} - A Slide object if available. Undefined if not.
  69. */
  70. getSlide( index ) {
  71. return SlideObjects.filter( Slide => Slide.index === index )[0];
  72. },
  73. /**
  74. * Return slide elements.
  75. *
  76. * @param {boolean} includeClones - Whether to include cloned slides or not.
  77. * @param {boolean} objects - Whether to return elements or Slide objects
  78. *
  79. * @return {Object[]|Element[]} - Slide objects or elements.
  80. */
  81. getSlides( includeClones, objects ) {
  82. if ( objects ) {
  83. return includeClones ? SlideObjects : SlideObjects.filter( Slide => ! Slide.isClone );
  84. }
  85. return includeClones ? SlideObjects.map( Slide => Slide.slide ) : slides;
  86. },
  87. /**
  88. * Return Slide objects belonging to the given page.
  89. *
  90. * @param {number} page - A page number.
  91. *
  92. * @return {Object[]} - An array containing Slide objects.
  93. */
  94. getSlidesByPage( page ) {
  95. const idx = Components.Controller.toIndex( page );
  96. const options = Splide.options;
  97. const max = options.focus !== false ? 1 : options.perPage;
  98. return SlideObjects.filter( ( { index } ) => idx <= index && index < idx + max );
  99. },
  100. /**
  101. * Return slides length without clones.
  102. *
  103. * @return {number} - Slide length.
  104. */
  105. get length() {
  106. return slides.length;
  107. },
  108. /**
  109. * Return "SlideObjects" length including clones.
  110. *
  111. * @return {number} - Slide length including clones.
  112. */
  113. get total() {
  114. return SlideObjects.length;
  115. },
  116. };
  117. /**
  118. * Initialization.
  119. */
  120. function init() {
  121. slides = Components.Elements.slides;
  122. slides.forEach( ( slide, index ) => { Slides.register( index, -1, slide ) } );
  123. }
  124. return Slides;
  125. }