tmagic-editor/docs/api/editor/historyServiceMethods.md
roymondchen 09558fa027 feat(editor): 历史记录接入 changeRecords,undo/redo 按 propPath 局部更新
- 节点 / 数据源 / 代码块的 history step 增加 changeRecords 字段

- editor.update / dataSource.update / codeBlock.setCodeDslById(Sync) 透传 changeRecords 入历史

- applyHistoryOp 的 update 分支:携带 changeRecords 时,按 propPath 从 oldNode/newNode 取值

  构造最小 patch 走 update,不冲掉同节点上其它无关变更;缺省退化为整节点替换

  (覆盖 sort/moveLayer/拖动等纯快照场景)

- editor.update 增加 changeRecordList 形参,多节点场景每个节点单独保留 records;

  use-stage 多选拖动 / 缩放改用 changeRecordList,避免 records 在多节点间共享

- use-code-block-edit.submitCodeBlockHandler 透传 form changeRecords

- 同步更新 editor / dataSource / codeBlock / history service 文档
2026-05-28 16:28:35 +08:00

251 lines
6.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# historyService方法
## reset
- **详情:**
重置全部历史记录(包括页面节点栈、代码块栈、数据源栈),并重置当前页面 id / canRedo / canUndo
## resetPage
- **详情:**
重置当前页面的历史记录状态清空当前页面id重置 canRedo/canUndo
## resetState
- **详情:**
重置历史记录全部内部状态(清空 pageId、pageSteps、canRedo、canUndo、codeBlockState、dataSourceState
## changePage
- **参数:**
- `{MPage | MPageFragment} page`
::: details 查看 MPage / MPageFragment 类型定义
<<< @/../packages/schema/src/index.ts#MPage{ts}
<<< @/../packages/schema/src/index.ts#MPageFragment{ts}
:::
- **详情**
按页面切换历史堆栈
## push
- **参数**
- `{StepValue} state`
::: details 查看 StepValue 及关联类型定义
<<< @/../packages/editor/src/type.ts#StepValue{ts}
<<< @/../packages/editor/src/type.ts#HistoryOpType{ts}
<<< @/../packages/schema/src/index.ts#Id{ts}
<<< @/../packages/schema/src/index.ts#MNode{ts}
<<< @/../packages/form-schema/src/base.ts#ChangeRecord{ts}
:::
- **返回**
- `{StepValue | null}`
- **详情**
添加一条历史记录
::: tip
`opType: 'update'` 的每个 `updatedItems[i]` 上可携带 `changeRecords`用于撤销 / 重做时仅按
`propPath` 局部更新对应字段避免整节点替换冲掉同节点上的其它无关变更不带
`changeRecords` 时退化为整节点替换 `sort` / `moveLayer` / 拖动等纯快照场景)。
:::
## undo
- **返回**
- `{StepValue | null}`
- **详情**
撤销当前操作`opType: 'update'` `updatedItems[i].changeRecords` 存在会按
`propPath` `oldNode` 取值做局部回滚否则用 `oldNode` 整节点替换
## redo
- **返回**
- `{StepValue | null}`
- **详情**
恢复到下一步`opType: 'update'` `updatedItems[i].changeRecords` 存在会按
`propPath` `newNode` 取值做局部重做否则用 `newNode` 整节点替换
## pushCodeBlock
- **参数**
- `{Id} codeBlockId` 代码块 id
- `{Object} payload`
- `{CodeBlockContent | null} oldContent` 变更前的代码块内容新增时为 `null`
- `{CodeBlockContent | null} newContent` 变更后的代码块内容删除时为 `null`
- `{ChangeRecord[]} changeRecords` 可选form propPath/value 变更列表撤销/重做时若有则按 propPath 局部更新缺省或空数组才退化为整内容替换
::: details 查看 CodeBlockStepValue 及关联类型定义
<<< @/../packages/editor/src/type.ts#CodeBlockStepValue{ts}
<<< @/../packages/schema/src/index.ts#CodeBlockContent{ts}
<<< @/../packages/form-schema/src/base.ts#ChangeRecord{ts}
:::
- **返回**
- `{CodeBlockStepValue | null}` 入栈失败未传 id时返回 `null`
- **详情**
推入一条代码块变更记录与页面 / 节点完全无关 `codeBlockId` 维度独立一份 `UndoRedo`
栈实例存放在 `historyService.state.codeBlockState[codeBlockId]`
入栈成功后会触发 `code-block-history-change` 事件
::: tip
`codeBlockService.setCodeDslByIdSync` `codeBlockService.deleteCodeDslByIds` 内部已经
自动调用本方法业务代码通常无需手动调用
:::
## undoCodeBlock
- **参数**
- `{Id} codeBlockId`
- **返回**
- `{CodeBlockStepValue | null}` 栈不存在或已无可撤销记录时返回 `null`
- **详情**
撤销指定代码块的最近一次变更成功时会触发 `code-block-history-change` 事件
拿到 step 后由调用方根据 `step.oldContent` 写回 `codeBlockService`本方法不会自动回放)。
## redoCodeBlock
- **参数**
- `{Id} codeBlockId`
- **返回**
- `{CodeBlockStepValue | null}` 栈不存在或已无可重做记录时返回 `null`
- **详情**
重做指定代码块的下一次变更成功时会触发 `code-block-history-change` 事件
## canUndoCodeBlock
- **参数**
- `{Id} codeBlockId`
- **返回**
- `{boolean}`
- **详情**
指定代码块当前是否可撤销栈不存在时返回 `false`
## canRedoCodeBlock
- **参数**
- `{Id} codeBlockId`
- **返回**
- `{boolean}`
- **详情**
指定代码块当前是否可重做栈不存在时返回 `false`
## pushDataSource
- **参数**
- `{Id} dataSourceId` 数据源 id
- `{Object} payload`
- `{DataSourceSchema | null} oldSchema` 变更前的数据源 schema新增时为 `null`
- `{DataSourceSchema | null} newSchema` 变更后的数据源 schema删除时为 `null`
- `{ChangeRecord[]} changeRecords` 可选form propPath/value 变更列表撤销/重做时若有则按 propPath 局部更新缺省或空数组才退化为整 schema 替换
::: details 查看 DataSourceStepValue 及关联类型定义
<<< @/../packages/editor/src/type.ts#DataSourceStepValue{ts}
<<< @/../packages/form-schema/src/base.ts#ChangeRecord{ts}
:::
- **返回**
- `{DataSourceStepValue | null}` 入栈失败未传 id时返回 `null`
- **详情**
推入一条数据源变更记录与页面 / 节点完全无关 `dataSourceId` 维度独立一份 `UndoRedo`
栈实例存放在 `historyService.state.dataSourceState[dataSourceId]`
入栈成功后会触发 `data-source-history-change` 事件
::: tip
`dataSourceService.add` / `update` / `remove` 内部已经自动调用本方法业务代码通常无需手动调用
:::
## undoDataSource
- **参数**
- `{Id} dataSourceId`
- **返回**
- `{DataSourceStepValue | null}`
- **详情**
撤销指定数据源的最近一次变更成功时会触发 `data-source-history-change` 事件
拿到 step 后由调用方根据 `step.oldSchema` 写回 `dataSourceService`本方法不会自动回放)。
## redoDataSource
- **参数**
- `{Id} dataSourceId`
- **返回**
- `{DataSourceStepValue | null}`
- **详情**
重做指定数据源的下一次变更成功时会触发 `data-source-history-change` 事件
## canUndoDataSource
- **参数**
- `{Id} dataSourceId`
- **返回**
- `{boolean}`
- **详情**
指定数据源当前是否可撤销栈不存在时返回 `false`
## canRedoDataSource
- **参数**
- `{Id} dataSourceId`
- **返回**
- `{boolean}`
- **详情**
指定数据源当前是否可重做栈不存在时返回 `false`
## destroy
- **详情**
销毁