BasicDataSource.ets 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // 拿走即用
  2. export class BasicDataSource<T> implements IDataSource {
  3. private listeners: DataChangeListener[] = [];
  4. private dataArray: T[] = [];
  5. // =============================================================
  6. // =================== 框架侧调用 ==============================
  7. // =============== 接口内部需实现的方法 ==========================
  8. // =============================================================
  9. // 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听
  10. registerDataChangeListener(listener: DataChangeListener): void {
  11. if (this.listeners.indexOf(listener) < 0) {
  12. console.info('add listener');
  13. this.listeners.push(listener);
  14. }
  15. }
  16. // 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听
  17. unregisterDataChangeListener(listener: DataChangeListener): void {
  18. const pos = this.listeners.indexOf(listener);
  19. if (pos >= 0) {
  20. console.info('remove listener');
  21. this.listeners.splice(pos, 1);
  22. }
  23. }
  24. // =============================================================
  25. // =================== 程序调用 ===============================
  26. // =========== 整合 DataChangeListener 内部的方法 ================
  27. // =============================================================
  28. // 通知LazyForEach组件需要重载所有子组件
  29. notifyDataReload(): void {
  30. this.listeners.forEach(listener => {
  31. listener.onDataReloaded();
  32. })
  33. }
  34. // 通知LazyForEach组件需要在index对应索引处添加子组件
  35. notifyDataAdd(index: number): void {
  36. this.listeners.forEach(listener => {
  37. listener.onDataAdd(index);
  38. })
  39. }
  40. // 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件
  41. notifyDataChange(index: number): void {
  42. this.listeners.forEach(listener => {
  43. listener.onDataChange(index);
  44. })
  45. }
  46. // 通知LazyForEach组件需要在index对应索引处删除该子组件
  47. notifyDataDelete(index: number): void {
  48. this.listeners.forEach(listener => {
  49. listener.onDataDelete(index);
  50. })
  51. }
  52. // 通知LazyForEach组件将from索引和to索引处的子组件进行交换
  53. notifyDataMove(from: number, to: number): void {
  54. this.listeners.forEach(listener => {
  55. listener.onDataMove(from, to);
  56. })
  57. }
  58. // =============================================================
  59. // ====================== 修改数据源 ===========================
  60. // ======================== 外部调用 =============================
  61. // =============================================================
  62. public totalCount(): number {
  63. return this.dataArray.length;
  64. }
  65. public getData(index: number): T {
  66. return this.dataArray[index];
  67. }
  68. // 在指定的索引处添加一个元素
  69. public addData(index: number, data: T): void {
  70. this.dataArray.splice(index, 0, data);
  71. this.notifyDataAdd(index);
  72. }
  73. // 往监听列表内部添加元素
  74. public pushData(data: T): void {
  75. this.dataArray.push(data);
  76. this.notifyDataAdd(this.dataArray.length - 1);
  77. }
  78. // 往监听列表内部添加元素
  79. public unshiftData(data: T): void {
  80. this.dataArray.unshift(data);
  81. this.notifyDataAdd(0);
  82. }
  83. // 所有数据进行重新赋值
  84. public init(data: T[]) {
  85. this.dataArray = data
  86. this.notifyDataReload()
  87. }
  88. // 传入一个数组, 初始化监听列表 - 在数组尾部追加数据
  89. public reloadDataPush(datas: T[]) {
  90. datas.forEach(i => {
  91. this.pushData(i)
  92. })
  93. }
  94. // 传入一个数组, 初始化监听列表
  95. public reloadDataUnshift(datas: T[]) {
  96. datas.forEach(i => {
  97. this.unshiftData(i)
  98. })
  99. }
  100. }