tmagic-editor/docs/api/editor/codeBlockServiceMethods.md
roymondchen 8dae67769c feat(editor): 数据源与代码块 service 支持 undo/redo
- dataSourceService / codeBlockService 新增 undo / redo / canUndo / canRedo 方法
- undo/redo 内部复用 add / update / remove / setCodeDslByIdSync / deleteCodeDslByIds 写回,
  并强制 doNotPushHistory,借此自动驱动 initService 中的依赖收集链路
  (DepTargetType.DATA_SOURCE / DATA_SOURCE_COND / DATA_SOURCE_METHOD / CODE_BLOCK)
- 更新场景下若 step 带 changeRecords,按 propPath 局部 patch,不冲掉同节点其它无关变更;
  缺省退化为整 schema / 整内容替换
- 补充对应单测与 API 文档
2026-05-28 16:40:49 +08:00

9.0 KiB
Raw Blame History

codeBlockService方法

setCodeDsl

  • 参数:

    • {CodeBlockDSL} codeDsl 代码块DSL

    ::: details 查看 CodeBlockDSL 及关联类型定义 <<< @/../packages/schema/src/index.ts#CodeBlockDSL{ts}

    <<< @/../packages/schema/src/index.ts#CodeBlockContent{ts}

    <<< @/../packages/schema/src/index.ts#CodeParam{ts} :::

  • 返回:

    • {Promise<void>}
  • 详情:

    设置活动的代码块dsl数据源并触发 code-dsl-change 事件

getCodeDsl

  • 返回:

    • {CodeBlockDSL | null}
  • 详情:

    获取活动的代码块dsl数据源默认从dsl中的codeBlocks字段读取

getCodeContentById

  • 参数:

    • {string | number} id 代码块id
  • 返回:

    • {CodeBlockContent | null}
  • 详情:

    根据代码块id获取代码块内容

setCodeDslById

  • 扩展支持

  • 参数:

    • {string | number} id 代码块id
    • {Partial<CodeBlockContent>} codeConfig 代码块内容配置信息
    • {Object} options 可选配置
      • {ChangeRecord[]} changeRecords form 端变更记录,用于历史记录的精细化撤销/重做
      • {boolean} doNotPushHistory 是否不写入历史记录(默认 false

    ::: details 查看 ChangeRecord 类型定义 <<< @/../packages/form-schema/src/base.ts#ChangeRecord{ts} :::

  • 返回:

    • {Promise<void>}
  • 详情:

    设置代码块ID和代码内容到源dsl强制写入底层调用 setCodeDslByIdSync

setCodeDslByIdSync

  • 参数:

    • {string | number} id 代码块id
    • {Partial<CodeBlockContent>} codeConfig 代码块内容配置信息
    • {boolean} force 是否强制写入,默认 true;为 false 时若同 id 已存在则跳过
    • {Object} options 可选配置
      • {ChangeRecord[]} changeRecords form 端变更记录,用于历史记录的精细化撤销/重做
      • {boolean} doNotPushHistory 是否不写入历史记录(默认 false
  • 返回:

    • {void}
  • 详情:

    同步版本的 setCodeDslById,并会触发 addOrUpdate 事件

    ::: tip 写入成功时(force=false 且同 id 已存在的跳过场景除外)会自动调用 historyService.pushCodeBlock 把本次变更入历史栈,参见 historyService.pushCodeBlock。 传入的 changeRecords 会一同写进 step撤销/重做时调用方可据此按 propPath 局部回放。 传入 doNotPushHistory: true 可跳过写入历史栈,常用于批量导入、外部同步等非用户操作场景。 :::

getCodeDslByIds

  • 参数:

    • {string[]} ids 代码块id数组
  • 返回:

    • {CodeBlockDSL} 命中的代码块dsl
  • 详情:

    根据代码块id数组获取代码dsl

getEditStatus

  • 返回:

    • {boolean} 是否可编辑
  • 详情:

    获取当前编辑状态

setEditStatus

  • 扩展支持

  • 参数:

    • {boolean} status 是否可编辑
  • 返回:

    • {Promise<void>}
  • 详情:

    设置代码块编辑状态

setCombineIds

  • 扩展支持

  • 参数:

    • {string[]} ids 代码块id数组
  • 返回:

    • {Promise<void>}
  • 详情:

    设置当前选中组件已关联绑定的代码块id数组

getCombineIds

  • 返回:

    • {string[]} 代码块id数组
  • 详情:

    获取当前选中组件已关联绑定的代码块id数组

getUndeletableList

  • 返回:

    • {(string | number)[]} 代码块id数组
  • 详情:

    获取不可删除列表

setUndeleteableList

  • 扩展支持

  • 参数:

    • {(string | number)[]} codeIds 代码块id数组
  • 返回:

    • {Promise<void>}
  • 详情:

    设置不可删除列表:为业务逻辑预留的不可删除的代码块列表,由业务逻辑维护(如代码块上线后不可删除)

setCodeDraft

  • 参数:

    • {string | number} codeId 代码块id
    • {string} content 代码草稿内容
  • 返回:

    • {void}
  • 详情:

    将代码草稿写入 localStorage

getCodeDraft

  • 参数:

    • {string | number} codeId 代码块id
  • 返回:

    • {string | null} 代码草稿内容
  • 详情:

    从 localStorage 读取代码草稿

removeCodeDraft

  • 参数:

    • {string | number} codeId 代码块id
  • 返回:

    • {void}
  • 详情:

    删除 localStorage 中的代码草稿

deleteCodeDslByIds

  • 扩展支持

  • 参数:

    • {(string | number)[]} codeIds 需要删除的代码块id数组
    • {Object} options 可选配置
      • {boolean} doNotPushHistory 是否不写入历史记录(默认 false
  • 返回:

    • {Promise<void>}
  • 详情:

    在dsl数据源中删除指定id的代码块每删除一个会触发一次 remove 事件

    ::: tip 对每个实际存在并被删除的代码块,会自动调用 historyService.pushCodeBlock 入栈一条 newContent=null 的删除记录;不存在的 id 不会入历史。传入 doNotPushHistory: true 也可显式跳过写入历史栈。 :::

undo

  • 参数:

    • {Id} id 代码块id
  • 返回:

    • {Promise<CodeBlockStepValue | null>} 撤销的 step栈不存在或已无可撤销时返回 null
  • 详情:

    撤销指定代码块的最近一次变更。内部根据 historyService 取出 step 后, 复用 setCodeDslByIdSync / deleteCodeDslByIds 写回, 并自动带上 doNotPushHistory: true,确保不会再次入栈。

    写回会触发对应的 addOrUpdate / remove 事件,编辑器内部据此重新维护 DepTargetType.CODE_BLOCK 的 dep target无需调用方额外处理。

    对于带有 changeRecords 的更新 step会按 propPath 局部 patch 当前代码块内容;缺省才退化为整内容替换, 避免冲掉同代码块上的其它无关变更。

  • 示例:

import { codeBlockService } from "@tmagic/editor";

if (codeBlockService.canUndo("code_1234")) {
  await codeBlockService.undo("code_1234");
}

redo

  • 参数:

    • {Id} id 代码块id
  • 返回:

    • {Promise<CodeBlockStepValue | null>} 重做的 step栈不存在或已无可重做时返回 null
  • 详情:

    重做指定代码块的下一次变更。其它行为同 undo

canUndo

  • 参数:

    • {Id} id 代码块id
  • 返回:

    • {boolean}
  • 详情:

    当前指定代码块是否可撤销,等价于 historyService.canUndoCodeBlock(id)

canRedo

  • 参数:

    • {Id} id 代码块id
  • 返回:

    • {boolean}
  • 详情:

    当前指定代码块是否可重做,等价于 historyService.canRedoCodeBlock(id)

setParamsColConfig

  • 参数:

    • {TableColumnConfig} config 参数列配置
  • 返回:

    • {void}
  • 详情:

    设置代码块入参表格列配置

getParamsColConfig

  • 返回:

    • {TableColumnConfig | undefined} 参数列配置
  • 详情:

    获取代码块入参表格列配置

getUniqueId

  • 返回:

    • {Promise<string>} 代码块唯一id
  • 详情:

    生成代码块唯一id格式为 code_xxxx与已有id冲突时会递归重试

copyWithRelated

  • 参数:

    • {MNode | MNode[]} config 组件节点配置
    • {TargetOptions} collectorOptions 可选的依赖收集器配置

    ::: details 查看 MNode 及关联类型定义 <<< @/../packages/schema/src/index.ts#MNode{ts}

    <<< @/../packages/schema/src/index.ts#MComponent{ts}

    <<< @/../packages/schema/src/index.ts#MContainer{ts}

    <<< @/../packages/schema/src/index.ts#MIteratorContainer{ts}

    <<< @/../packages/schema/src/index.ts#MPage{ts}

    <<< @/../packages/schema/src/index.ts#MApp{ts}

    <<< @/../packages/schema/src/index.ts#MPageFragment{ts} :::

  • 返回:

    • {void}
  • 详情:

    复制组件时会带上组件关联的代码块将关联的代码块dsl存储到 localStorage

paste

  • 返回:

    • {void}
  • 详情:

    粘贴代码块。从 localStorage 读取已复制的代码块dsl并写入当前dsl已存在同id的代码块不会被覆盖

resetState

  • 返回:

    • {void}
  • 详情:

    重置 codeBlockService 状态

destroy

  • 返回:

    • {void}
  • 详情:

    销毁 codeBlockService重置状态并移除所有事件监听和插件

usePlugin

  • 详情:

    usePlugin支持灵活细致的扩展 上述方法中标记有扩展支持: 是的方法都支持使用usePlugin扩展

每个支持扩展的方法都支持定制before、after两个hook来干预原有方法的行为before可以用于修改传入参数after可以用于修改返回的值

removeAllPlugins

  • 详情:

删掉当前设置的所有扩展