@ticatec/app-data-manager
Version:
A comprehensive TypeScript library providing hierarchical data manager classes for CRUD operations, pagination, and data management in frontend applications. Features include full list, paged, and stackable data managers with built-in caching and transfor
91 lines (90 loc) • 2.38 kB
JavaScript
import "@ticatec/enhanced-utils/EnArray";
/**
* 基础数据管理器抽象类,提供数据的基本CRUD操作和本地缓存管理
* @template T 继承自CommonDataService的服务类型
*/
export default class BaseDataManager {
_list;
fromTop = true;
service;
checkEqual;
convert;
tagData;
/**
* 构造函数
* @param service 数据服务实例
* @param keyField 主键字段名或相等性检查函数
* @param options 配置选项
*/
constructor(service, keyField, options = null) {
this.service = service;
this.checkEqual = typeof keyField == "string" ? ((o1, o2) => o1[keyField] == o2[keyField]) : keyField;
this.convert = options?.convert;
this.fromTop = options?.fromTop ?? true;
this.tagData = options?.tagData;
}
/**
* 保存一条记录到数据库,并加入到本地集合
* @param data 要保存的数据
* @param isNew 是否为新数据
*/
async save(data, isNew) {
let item = await this.service.save(data, isNew);
if (this.convert != null) {
item = this.convert(item, isNew);
}
if (isNew) {
this._list = [item, ...this._list];
}
else {
this._list.replace(item, this.checkEqual);
}
}
/**
* 删除一条记录,并从本地集合中删除
* @param item 要删除的数据项
*/
async remove(item) {
await this.service.remove(item);
this._list.remove(item);
}
/**
* 从列表中删除数据
* @param item 要删除的数据项
* @protected
*/
removeItem(item) {
this._list.remove(item);
}
/**
* 替换主键相同的条目
* @param item 要替换的数据项
* @protected
*/
replace(item) {
this._list.replace(item, this.checkEqual);
}
/**
* 在列表增加一个条目到最前面
* @param item 要添加的数据项
* @protected
*/
append(item) {
this._list = [item, ...this._list];
}
/**
* 设置数据集
* @param value 新的数据集
* @protected
*/
set list(value) {
this._list = value;
}
/**
* 当前的数据集
* @returns 数据集的副本
*/
get list() {
return [...this._list];
}
}