tmagic-editor/docs/runtime-api/data-source/dataSourceManager.md
roymondchen 3eb8cc0614 docs: 完善 editor/form/runtime/stage 等 API 文档参数与说明
补全方法的参数类型、返回值类型与详情说明,规范字段编辑器/字段配置/运行时 API 等文档。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-07 17:33:58 +08:00

8.1 KiB
Raw Blame History

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}
  • 详情:

    清除所有已注册的数据源类(保留 basehttp)。

registerObservedData

  • 参数:

    • {ObservedDataClass} observedDataClass 观察者数据类
  • 返回:

    • {void}
  • 详情:

    注册自定义的观察者数据类。

实例方法

init

  • 参数:

    • {DataSource} ds 单个数据源实例(必填)
  • 返回:

    • {Promise<void>}
  • 详情:

    初始化单个数据源。会按 methodstiming === 'beforeInit' 的方法依次执行,再调用 ds.init(),最后执行 timing === 'afterInit' 的方法。当 ds.isInittrue,或当前 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.immediatetrue 时,订阅后立即用当前值触发一次回调(具体语义取决于 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);
});