补全方法的参数类型、返回值类型与详情说明,规范字段编辑器/字段配置/运行时 API 等文档。 Co-authored-by: Cursor <cursoragent@cursor.com>
8.1 KiB
DataSourceManager
DataSourceManager 是 @tmagic/data-source 的核心类,用于管理所有数据源的生命周期、数据编译和事件分发。
构造函数
new DataSourceManager(options: DataSourceManagerOptions)
DataSourceManagerOptions
| 参数 | 类型 | 说明 |
|---|---|---|
app |
TMagicApp |
应用实例 |
initialData |
DataSourceManagerData |
初始数据(可选,用于 SSR) |
useMock |
boolean |
是否使用 Mock 数据(可选) |
属性
| 属性 | 类型 | 说明 |
|---|---|---|
app |
TMagicApp |
应用实例 |
dataSourceMap |
Map<string, DataSource> |
数据源映射表 |
data |
DataSourceManagerData |
所有数据源的数据 |
initialData |
DataSourceManagerData |
初始化数据 |
useMock |
boolean |
是否使用 Mock 数据 |
静态方法
register
-
参数:
{string} type数据源类型{typeof DataSource} dataSourceClass数据源类
-
返回:
{void}
-
详情:
注册自定义数据源类型。
-
示例:
import { DataSourceManager } from '@tmagic/data-source';
class CustomDataSource extends DataSource {
// 自定义实现
}
DataSourceManager.register('custom', CustomDataSource);
getDataSourceClass
-
参数:
{string} type数据源类型
-
返回:
{typeof DataSource | undefined}
-
详情:
获取已注册的数据源类。
clearDataSourceClass
-
返回:
{void}
-
详情:
清除所有已注册的数据源类(保留
base和http)。
registerObservedData
-
参数:
{ObservedDataClass} observedDataClass观察者数据类
-
返回:
{void}
-
详情:
注册自定义的观察者数据类。
实例方法
init
-
参数:
{DataSource} ds单个数据源实例(必填)
-
返回:
{Promise<void>}
-
详情:
初始化单个数据源。会按
methods中timing === 'beforeInit'的方法依次执行,再调用ds.init(),最后执行timing === 'afterInit'的方法。当ds.isInit为true,或当前app.jsEngine命中ds.schema.disabledInitInJsEngine时直接跳过。 -
示例:
const ds = dataSourceManager.get('ds_1');
if (ds) {
await dataSourceManager.init(ds);
}
get
-
参数:
{string} id数据源 ID
-
返回:
{DataSource | undefined}
-
详情:
获取指定 ID 的数据源实例。
-
示例:
const ds = dataSourceManager.get('ds_1');
addDataSource
-
参数:
{DataSourceSchema} config数据源配置(可选)
-
返回:
{DataSource | undefined}
-
详情:
添加新的数据源。当对应类型尚未注册(即
dataSourceClassMap中无该类型)时,会将配置缓存到waitInitSchemaList,并返回undefined,待register时再补建实例。 -
示例:
const ds = dataSourceManager.addDataSource({
id: 'new_ds',
type: 'base',
fields: []
});
removeDataSource
-
参数:
{string} id数据源 ID
-
返回:
{void}
-
详情:
移除指定的数据源。
setData
-
参数:
{DataSource} ds数据源实例{ChangeEvent} changeEvent变化事件,形如{ updateData, path? }
-
返回:
{void}
-
详情:
将
ds.data同步到this.data[ds.id],并以(ds.id, changeEvent)触发change事件。
updateSchema
-
参数:
{DataSourceSchema[]} schemas数据源配置数组
-
返回:
{void}
-
详情:
同步更新数据源 DSL 配置:先按
id移除已有数据源,再以cloneDeep重新addDataSource,并对新建实例触发init(异步执行,不会被该方法await)。一般在编辑器中修改配置后调用。
compiledNode
-
参数:
{MNode} node节点配置{string} sourceId数据源 ID(可选){boolean} deep是否深度编译(可选)
-
返回:
{MNode}
-
详情:
编译节点 DSL 中的数据源配置,将数据源引用替换为实际值。
-
示例:
const compiledNode = dataSourceManager.compiledNode({
id: 'text_1',
type: 'text',
text: '${ds_1.username}'
});
// compiledNode.text 会被替换为实际的用户名
compliedConds
-
参数:
{ { [NODE_CONDS_KEY]?: DisplayCond[]; [NODE_CONDS_RESULT_KEY]?: boolean; [NODE_DISABLE_DATA_SOURCE_KEY]?: boolean } } node带条件字段的结构(不要求是完整的 MNode){DataSourceManagerData} data数据上下文(可选,默认使用this.data)
-
返回:
{boolean}节点是否应该显示
-
详情:
编译显示条件,返回节点是否应该显示。
-
示例:
const shouldShow = dataSourceManager.compliedConds(node);
compliedIteratorItemConds
-
参数:
{any} itemData迭代项数据{ { [NODE_CONDS_KEY]?: DisplayCond[] } } node带条件字段的结构{string[]} dataSourceField迭代数据在数据源中的字段路径,格式如['dsId', 'key1', 'key2'](可选,默认[])
-
返回:
{boolean}
-
详情:
编译迭代器项的显示条件。
compliedIteratorItems
-
参数:
{any} itemData迭代项数据{MNode[]} nodes节点配置数组{string[]} dataSourceField迭代数据在数据源中的字段路径(可选,默认[])
-
返回:
{MNode[]}
-
详情:
编译迭代器项的节点配置。
isAllDataSourceRegistered
-
返回:
{boolean}
-
详情:
判断 DSL 中声明的所有数据源是否都已注册并实例化(即
dataSourceMap.size === dsl.dataSources.length,或 DSL 未声明数据源)。::: tip
registered-all触发时机registered-all事件仅在addDataSource末尾、isAllDataSourceRegistered()为真时触发。当dsl.dataSources为空数组时,构造函数不会进入任何一次addDataSource调用,因此不会触发该事件,但仍可能执行callDsInit()。 :::
onDataChange
-
参数:
{string} id数据源 ID{string} path数据路径{(payload: any) => void} callback回调函数(具体入参取决于ObservedData实现,详见 DataSource.onDataChange){ { immediate?: boolean } } options选项(可选)
-
返回:
{void}
-
详情:
监听数据源数据变化。
options.immediate为true时,订阅后立即用当前值触发一次回调(具体语义取决于ObservedData的实现)。 -
示例:
dataSourceManager.onDataChange('ds_1', 'user.name', (newVal) => {
console.log('用户名变更:', newVal);
});
offDataChange
-
参数:
{string} id数据源 ID{string} path数据路径{(newVal: any) => void} callback回调函数
-
返回:
{void}
-
详情:
取消监听数据源数据变化。
destroy
-
返回:
{void}
-
详情:
销毁数据源管理器,清理所有数据源。
事件
DataSourceManager 继承自 EventEmitter,支持以下事件:
| 事件名 | 说明 | 回调参数 |
|---|---|---|
change |
单个数据源数据变化 | (dsId: string, changeEvent: ChangeEvent) |
init |
所有数据源初始化完成;现代分支携带 (data, errors),旧 Promise.all 分支为 (this.data) |
(data, errors?) |
registered-all |
所有数据源注册完成 | 无 |
update-data |
由 createDataSourceManager 在数据变化后发出,用于通知节点重新渲染 |
(newNodes: MNode[], sourceId: string, changeEvent: ChangeEvent, pageId: Id) |
事件监听示例
dataSourceManager.on('change', (dsId, changeEvent) => {
console.log(`数据源 ${dsId} 变更:`, changeEvent);
});
dataSourceManager.on('init', (data, errors) => {
console.log('所有数据源初始化完成', data, errors);
});