Nenhuma descrição

ons-lazy-repeat.js 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. import _Object$getPrototypeOf from 'babel-runtime/core-js/object/get-prototype-of';
  2. import _classCallCheck from 'babel-runtime/helpers/classCallCheck';
  3. import _createClass from 'babel-runtime/helpers/createClass';
  4. import _possibleConstructorReturn from 'babel-runtime/helpers/possibleConstructorReturn';
  5. import _inherits from 'babel-runtime/helpers/inherits';
  6. /*
  7. Copyright 2013-2015 ASIAL CORPORATION
  8. Licensed under the Apache License, Version 2.0 (the "License");
  9. you may not use this file except in compliance with the License.
  10. You may obtain a copy of the License at
  11. http://www.apache.org/licenses/LICENSE-2.0
  12. Unless required by applicable law or agreed to in writing, software
  13. distributed under the License is distributed on an "AS IS" BASIS,
  14. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. See the License for the specific language governing permissions and
  16. limitations under the License.
  17. */
  18. import onsElements from '../ons/elements';
  19. import util from '../ons/util';
  20. import internal from '../ons/internal';
  21. import BaseElement from './base/base-element';
  22. import { LazyRepeatDelegate, LazyRepeatProvider } from '../ons/internal/lazy-repeat';
  23. /**
  24. * @element ons-lazy-repeat
  25. * @category list
  26. * @description
  27. * [en]
  28. * Using this component a list with millions of items can be rendered without a drop in performance.
  29. * It does that by "lazily" loading elements into the DOM when they come into view and
  30. * removing items from the DOM when they are not visible.
  31. * [/en]
  32. * [ja]
  33. * このコンポーネント内で描画されるアイテムのDOM要素の読み込みは、画面に見えそうになった時まで自動的に遅延され、
  34. * 画面から見えなくなった場合にはその要素は動的にアンロードされます。
  35. * このコンポーネントを使うことで、パフォーマンスを劣化させること無しに巨大な数の要素を描画できます。
  36. * [/ja]
  37. * @codepen QwrGBm
  38. * @tutorial vanilla/Reference/lazy-repeat
  39. * @seealso ons-list
  40. * [en]The `<ons-list>` element is used to render a list.[/en]
  41. * [ja]`<ons-list>`要素はリストを描画するのに使われます。[/ja]
  42. * @example
  43. * <script>
  44. * window.addEventListener('load', function() {
  45. * var lazyRepeat = document.querySelector('#list');
  46. * lazyRepeat.delegate = {
  47. * createItemContent: function(i, template) {
  48. * var dom = template.cloneNode(true);
  49. * dom.innerText = i;
  50. *
  51. * return dom;
  52. * },
  53. * countItems: function() {
  54. * return 10000000;
  55. * },
  56. * destroyItem: function(index, item) {
  57. * console.log('Destroyed item with index: ' + index);
  58. * }
  59. * };
  60. * });
  61. * </script>
  62. *
  63. * <ons-list id="list">
  64. * <ons-lazy-repeat>
  65. * <ons-list-item></ons-list-item>
  66. * </ons-lazy-repeat>
  67. * </ons-list>
  68. */
  69. var LazyRepeatElement = function (_BaseElement) {
  70. _inherits(LazyRepeatElement, _BaseElement);
  71. function LazyRepeatElement() {
  72. _classCallCheck(this, LazyRepeatElement);
  73. return _possibleConstructorReturn(this, (LazyRepeatElement.__proto__ || _Object$getPrototypeOf(LazyRepeatElement)).apply(this, arguments));
  74. }
  75. _createClass(LazyRepeatElement, [{
  76. key: 'connectedCallback',
  77. value: function connectedCallback() {
  78. // not very good idea and also not documented
  79. if (this.hasAttribute('delegate')) {
  80. this.delegate = window[this.getAttribute('delegate')];
  81. }
  82. }
  83. /**
  84. * @property delegate
  85. * @type {Object}
  86. * @description
  87. * [en]Specify a delegate object to load and unload item elements.[/en]
  88. * [ja]要素のロード、アンロードなどの処理を委譲するオブジェクトを指定します。[/ja]
  89. */
  90. /**
  91. * @property delegate.createItemContent
  92. * @type {Function}
  93. * @description
  94. * [en]
  95. * This function should return a `HTMLElement`.
  96. *
  97. * To help rendering the element, the current index and a template is supplied as arguments. The template is the initial content of the `<ons-lazy-repeat>` element.
  98. * [/en]
  99. * [ja]
  100. * この関数は`HTMLElement`を返してください。
  101. * 要素を生成しやすくするために、現在のアイテムのインデックスとテンプレートが引数に渡されます。
  102. * このテンプレートは、`<ons-lazy-repeat>`要素のコンテンツが渡されます。
  103. * [/ja]
  104. */
  105. /**
  106. * @property delegate.countItems
  107. * @type {Function}
  108. * @description
  109. * [en]Should return the number of items in the list.[/en]
  110. * [ja]リスト内のアイテム数を返してください。[/ja]
  111. */
  112. /**
  113. * @property delegate.calculateItemHeight
  114. * @type {Function}
  115. * @description
  116. * [en]
  117. * Should return the height of an item. The index is provided as an argument.
  118. *
  119. * This is important when rendering lists where the items have different height.
  120. *
  121. * The function is optional and if it isn't present the height of the first item will be automatically calculated and used for all other items.
  122. * [/en]
  123. * [ja]
  124. * アイテムの高さ(ピクセル)を返してください。アイテムのインデックス値は引数で渡されます。
  125. * この関数は、それぞれのアイムが違った高さを持つリストをレンダリングする際に重要です。
  126. * この関数はオプショナルです。もしこの関数が無い場合には、
  127. * 最初のアイテムの高さが他のすべてのアイテムの高さとして利用されます。
  128. * [/ja]
  129. */
  130. /**
  131. * @property delegate.destroyItem
  132. * @type {Function}
  133. * @description
  134. * [en]
  135. * This function is used called when an item is removed from the DOM. The index and DOM element is provided as arguments.
  136. *
  137. * The function is optional but may be important in order to avoid memory leaks.
  138. * [/en]
  139. * [ja]
  140. * この関数は、あるアイテムがDOMツリーから除かれた時に呼び出されます。
  141. * アイテムのインデックス値とDOM要素が引数として渡されます。
  142. * この関数はオプショナルですが、各アイテムの後処理が必要な場合にはメモリーリークを避けるために重要です。
  143. * [/ja]
  144. */
  145. }, {
  146. key: 'refresh',
  147. /**
  148. * @method refresh
  149. * @signature refresh()
  150. * @description
  151. * [en]Refresh the list. Use this method when the data has changed.[/en]
  152. * [ja]リストを更新します。もしデータが変わった場合にはこのメソッドを使ってください。[/ja]
  153. */
  154. value: function refresh() {
  155. this._lazyRepeatProvider && this._lazyRepeatProvider.refresh();
  156. }
  157. }, {
  158. key: 'attributeChangedCallback',
  159. value: function attributeChangedCallback(name, last, current) {}
  160. }, {
  161. key: 'disconnectedCallback',
  162. value: function disconnectedCallback() {
  163. if (this._lazyRepeatProvider) {
  164. this._lazyRepeatProvider.destroy();
  165. this._lazyRepeatProvider = null;
  166. }
  167. }
  168. }, {
  169. key: 'delegate',
  170. set: function set(userDelegate) {
  171. this._lazyRepeatProvider && this._lazyRepeatProvider.destroy();
  172. if (!this._templateElement && this.children[0]) {
  173. this._templateElement = this.removeChild(this.children[0]);
  174. }
  175. var delegate = new LazyRepeatDelegate(userDelegate, this._templateElement || null);
  176. this._lazyRepeatProvider = new LazyRepeatProvider(this.parentElement, delegate);
  177. },
  178. get: function get() {
  179. util.throw('No delegate getter');
  180. }
  181. }]);
  182. return LazyRepeatElement;
  183. }(BaseElement);
  184. export default LazyRepeatElement;
  185. internal.LazyRepeatDelegate = LazyRepeatDelegate;
  186. internal.LazyRepeatProvider = LazyRepeatProvider;
  187. onsElements.LazyRepeat = LazyRepeatElement;
  188. customElements.define('ons-lazy-repeat', LazyRepeatElement);