// 拿走即用 export class BasicDataSource implements IDataSource { private listeners: DataChangeListener[] = []; private dataArray: T[] = []; // ============================================================= // =================== 框架侧调用 ============================== // =============== 接口内部需实现的方法 ========================== // ============================================================= // 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听 registerDataChangeListener(listener: DataChangeListener): void { if (this.listeners.indexOf(listener) < 0) { console.info('add listener'); this.listeners.push(listener); } } // 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听 unregisterDataChangeListener(listener: DataChangeListener): void { const pos = this.listeners.indexOf(listener); if (pos >= 0) { console.info('remove listener'); this.listeners.splice(pos, 1); } } // ============================================================= // =================== 程序调用 =============================== // =========== 整合 DataChangeListener 内部的方法 ================ // ============================================================= // 通知LazyForEach组件需要重载所有子组件 notifyDataReload(): void { this.listeners.forEach(listener => { listener.onDataReloaded(); }) } // 通知LazyForEach组件需要在index对应索引处添加子组件 notifyDataAdd(index: number): void { this.listeners.forEach(listener => { listener.onDataAdd(index); }) } // 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件 notifyDataChange(index: number): void { this.listeners.forEach(listener => { listener.onDataChange(index); }) } // 通知LazyForEach组件需要在index对应索引处删除该子组件 notifyDataDelete(index: number): void { this.listeners.forEach(listener => { listener.onDataDelete(index); }) } // 通知LazyForEach组件将from索引和to索引处的子组件进行交换 notifyDataMove(from: number, to: number): void { this.listeners.forEach(listener => { listener.onDataMove(from, to); }) } // ============================================================= // ====================== 修改数据源 =========================== // ======================== 外部调用 ============================= // ============================================================= public totalCount(): number { return this.dataArray.length; } public getData(index: number): T { return this.dataArray[index]; } // 在指定的索引处添加一个元素 public addData(index: number, data: T): void { this.dataArray.splice(index, 0, data); this.notifyDataAdd(index); } // 往监听列表内部添加元素 public pushData(data: T): void { this.dataArray.push(data); this.notifyDataAdd(this.dataArray.length - 1); } // 往监听列表内部添加元素 public unshiftData(data: T): void { this.dataArray.unshift(data); this.notifyDataAdd(0); } // 所有数据进行重新赋值 public init(data: T[]) { this.dataArray = data this.notifyDataReload() } // 传入一个数组, 初始化监听列表 - 在数组尾部追加数据 public reloadDataPush(datas: T[]) { datas.forEach(i => { this.pushData(i) }) } // 传入一个数组, 初始化监听列表 public reloadDataUnshift(datas: T[]) { datas.forEach(i => { this.unshiftData(i) }) } }