LazyForeachDeal.ets 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // BasicDataSource实现了IDataSource接口,用于管理listener监听,以及通知LazyForEach数据更新
  2. class BasicDataSource implements IDataSource {
  3. private listeners: DataChangeListener[] = [];
  4. private originDataArray: object[] = [];
  5. public totalCount(): number {
  6. return 0;
  7. }
  8. public getData(index: number): object {
  9. return this.originDataArray[index];
  10. }
  11. // 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听
  12. registerDataChangeListener(listener: DataChangeListener): void {
  13. if (this.listeners.indexOf(listener) < 0) {
  14. console.info('add listener');
  15. this.listeners.push(listener);
  16. }
  17. }
  18. // 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听
  19. unregisterDataChangeListener(listener: DataChangeListener): void {
  20. const pos = this.listeners.indexOf(listener);
  21. if (pos >= 0) {
  22. console.info('remove listener');
  23. this.listeners.splice(pos, 1);
  24. }
  25. }
  26. // 通知LazyForEach组件需要重载所有子组件
  27. notifyDataReload(): void {
  28. this.listeners.forEach(listener => {
  29. listener.onDataReloaded();
  30. })
  31. }
  32. // 通知LazyForEach组件需要在index对应索引处添加子组件
  33. notifyDataAdd(index: number): void {
  34. this.listeners.forEach(listener => {
  35. listener.onDataAdd(index);
  36. // 写法2:listener.onDatasetChange([{type: DataOperationType.ADD, index: index}]);
  37. })
  38. }
  39. // 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件
  40. notifyDataChange(index: number): void {
  41. this.listeners.forEach(listener => {
  42. listener.onDataChange(index);
  43. // 写法2:listener.onDatasetChange([{type: DataOperationType.CHANGE, index: index}]);
  44. })
  45. }
  46. // 通知LazyForEach组件需要在index对应索引处删除该子组件
  47. notifyDataDelete(index: number): void {
  48. this.listeners.forEach(listener => {
  49. listener.onDataDelete(index);
  50. // 写法2:listener.onDatasetChange([{type: DataOperationType.DELETE, index: index}]);
  51. })
  52. }
  53. // 通知LazyForEach组件将from索引和to索引处的子组件进行交换
  54. notifyDataMove(from: number, to: number): void {
  55. this.listeners.forEach(listener => {
  56. listener.onDataMove(from, to);
  57. // 写法2:listener.onDatasetChange(
  58. // [{type: DataOperationType.EXCHANGE, index: {start: from, end: to}}]);
  59. })
  60. }
  61. notifyDatasetChange(operations: DataOperation[]): void {
  62. this.listeners.forEach(listener => {
  63. listener.onDatasetChange(operations);
  64. })
  65. }
  66. }
  67. export class LazyForeachDeal extends BasicDataSource {
  68. private dataArray: object[] = [];
  69. public totalCount(): number {
  70. return this.dataArray.length;
  71. }
  72. public getData(index: number): object {
  73. return this.dataArray[index];
  74. }
  75. public pushData(data: object): void {
  76. this.dataArray.push(data);
  77. this.notifyDataAdd(this.dataArray.length - 1);
  78. }
  79. public concatList(data: object[]): void {
  80. this.dataArray.push(...data)
  81. this.notifyDatasetChange([{
  82. type: DataOperationType.ADD,
  83. index: this.dataArray.length - 1,
  84. count: data.length
  85. }])
  86. }
  87. public deleteData(index: number): void {
  88. this.dataArray.splice(index, 1);
  89. this.notifyDataDelete(index);
  90. }
  91. public reloadData(dataArray: object[]): void {
  92. this.dataArray = dataArray
  93. this.notifyDataReload();
  94. }
  95. }