/* * Copyright (c) Huawei Technologies Co., Ltd. 2021-2023. All rights reserved. */ import { ObservedArray } from '../data/ObservedArray'; import { BaseState, ViewState } from './ViewState'; /** * * @param 页面状态 * @param 页面数据 */ export abstract class AbsBaseViewData implements IDataSource { private listeners: DataChangeListener[] = [] /** * view state */ private state: VS; /** * view live date list */ private liveData: ObservedArray = new ObservedArray(); /** * 构造函数 */ protected constructor() { this.state = this.initViewState(); } totalCount(): number { return this.liveData.length } registerDataChangeListener(listener: DataChangeListener) { if (this.listeners.indexOf(listener) < 0) { this.listeners.push(listener) } } unregisterDataChangeListener(listener: DataChangeListener): void { const pos = this.listeners.indexOf(listener); if (pos >= 0) { this.listeners.splice(pos, 1) } } public getData(index: number): VD { return this.liveData[index] } private initViewState(): VS { return this.createViewState(); } protected abstract createViewState(): VS; public getState(): VS { return this.state; } /** * start loading */ public loading(): void { if (this.isEmpty()) { this.state?.setViewState(BaseState.LOADING); } } public normal(newData: ObservedArray): void { this.clear() this.liveData.push(...newData); this.notifyDataReload() this.state.setViewState(BaseState.NORMAL); } /** * finish loading without data */ public normalState(): void { this.state?.setViewState(BaseState.NORMAL); } /** * clear livedata */ public clear(): void { this.liveData.splice(0, this.liveData?.length) } /** * 获取列表数据,不可变 * * @return 不可变列表数据,运行时放通,问题在开发阶段发现问题 */ public getDataList(): ObservedArray { return this.liveData; } /** * 针对分页的数据,不要使用normal,直接使用append * * @param appendData 需要追加的数据 */ public append(appendData: VD[]): void { this.liveData.push(...appendData); this.notifyDataReload() this.state.setViewState(BaseState.NORMAL); } /** * 针对分页的数据,不要使用normal,直接使用append * @param index index * @param appendData 需要追加的数据 */ public appendByIndex(index: number, appendData: VD[]): void { this.liveData.splice(index, 0, ...appendData); this.notifyDataAdd(index); this.notifyDataReload() this.state.setViewState(BaseState.NORMAL); } /** * finish loading without data (only one data) * * @param newData newData */ public appendSingle(newData: VD): void { this.liveData.push(newData); this.state.setViewState(BaseState.NORMAL); } /** * 移除 * * @param index 位置 */ public remove(index: number): void { this.liveData.splice(index, 1) this.notifyDataDelete(index) this.notifyDataReload() } /** * 设置数据是否为空,涉及nodata页面展示 * * @return 数据是否为空 */ public isEmpty(): boolean { return this.liveData.length === 0; } notifyDataReload(): void { this.listeners.forEach(listener => { listener.onDataReloaded() }) } notifyDataAdd(index: number): void { this.listeners.forEach(listener => { listener.onDataAdd(index) }) } notifyDataChange(index: number): void { this.listeners.forEach(listener => { listener.onDataChange(index) }) } notifyDataDelete(index: number): void { this.listeners.forEach(listener => { listener.onDataDelete(index) }) } notifyDataMove(from: number, to: number): void { this.listeners.forEach(listener => { listener.onDataMove(from, to) }) } }