tmagic-editor/docs/api/editor/historyServiceMethods.html
2026-06-04 09:22:54 +00:00

241 lines
105 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

<!DOCTYPE html>
<html lang="en-US" dir="ltr">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>historyService方法 | tmagic-editor</title>
<meta name="description" content="页面可视化平台">
<meta name="generator" content="VitePress v2.0.0-alpha.17">
<link rel="preload stylesheet" href="/tmagic-editor/docs/assets/style.B2Y-cHQK.css" as="style">
<link rel="preload stylesheet" href="/tmagic-editor/docs/vp-icons.css" as="style">
<script type="module" src="/tmagic-editor/docs/assets/app.B3MGcKp5.js"></script>
<link rel="preload" href="/tmagic-editor/docs/assets/inter-roman-latin.Cy4MYw_J.woff2" as="font" type="font/woff2" crossorigin="">
<link rel="modulepreload" href="/tmagic-editor/docs/assets/chunks/theme.WuWAEVfw.js">
<link rel="modulepreload" href="/tmagic-editor/docs/assets/chunks/framework.V2ssSR2R.js">
<link rel="modulepreload" href="/tmagic-editor/docs/assets/api_editor_historyServiceMethods.md.vIXypc6c.lean.js">
<meta name="theme-color" content="#646cff">
<script id="check-dark-mode">(()=>{const e=localStorage.getItem("vitepress-theme-appearance")||"auto",a=window.matchMedia("(prefers-color-scheme: dark)").matches;(!e||e==="auto"?a:e==="dark")&&document.documentElement.classList.add("dark")})();</script>
<script id="check-mac-os">document.documentElement.classList.toggle("mac",/Mac|iPhone|iPod|iPad/i.test(navigator.platform));</script>
</head>
<body>
<div id="app"><div class="Layout" data-v-52085faa><!--[--><!--]--><!--[--><span tabindex="-1" data-v-002a3b7b></span><a href="#VPContent" class="VPSkipLink visually-hidden" data-v-002a3b7b>Skip to content</a><!--]--><!----><header class="VPNav" data-v-52085faa data-v-66bfbe5f><div class="VPNavBar has-sidebar top" data-v-66bfbe5f data-v-e3720e23><div class="wrapper" data-v-e3720e23><div class="container" data-v-e3720e23><div class="title" data-v-e3720e23><div class="VPNavBarTitle has-sidebar" data-v-e3720e23 data-v-0cf55604><a class="title" href="/tmagic-editor/docs/" data-v-0cf55604><!--[--><!--]--><!--[--><img class="VPImage logo" src="./favicon.png" alt data-v-9c21079f><!--]--><span data-v-0cf55604>tmagic-editor</span><!--[--><!--]--></a></div></div><div class="content" data-v-e3720e23><div class="content-body" data-v-e3720e23><!--[--><!--]--><div class="VPNavBarSearch search" data-v-e3720e23 data-v-aeb47f76><!--[--><button type="button" class="VPNavBarSearchButton" aria-label="Search" aria-keyshortcuts="/ control+k meta+k" data-v-aeb47f76 data-v-9cf61dd5><span class="vpi-search" aria-hidden="true" data-v-9cf61dd5></span><span class="text" data-v-9cf61dd5>Search</span><span class="keys" aria-hidden="true" data-v-9cf61dd5><kbd class="key-cmd" data-v-9cf61dd5></kbd><kbd class="key-ctrl" data-v-9cf61dd5>Ctrl</kbd><kbd data-v-9cf61dd5>K</kbd></span></button><!----><!--]--></div><nav aria-labelledby="main-nav-aria-label" class="VPNavBarMenu menu" data-v-e3720e23 data-v-ec5ae824><span id="main-nav-aria-label" class="visually-hidden" data-v-ec5ae824> Main Navigation </span><!--[--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/tmagic-editor/docs/guide/" tabindex="0" data-v-ec5ae824 data-v-43d45074><!--[--><span data-v-43d45074>文档</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink active" href="/tmagic-editor/docs/api/editor/props.html" tabindex="0" data-v-ec5ae824 data-v-43d45074><!--[--><span data-v-43d45074>Editor API</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/tmagic-editor/docs/runtime-api/core/app.html" tabindex="0" data-v-ec5ae824 data-v-43d45074><!--[--><span data-v-43d45074>Runtime API</span><!--]--></a><!--]--><!--[--><a class="VPLink link VPNavBarMenuLink" href="/tmagic-editor/docs/form-config/fields/text.html" tabindex="0" data-v-ec5ae824 data-v-43d45074><!--[--><span data-v-43d45074>表单配置</span><!--]--></a><!--]--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://github.com/Tencent/tmagic-editor/releases" target="_blank" rel="noreferrer" tabindex="0" data-v-ec5ae824 data-v-43d45074><!--[--><span data-v-43d45074>更新日志</span><!--]--></a><!--]--><!--[--><a class="VPLink link vp-external-link-icon VPNavBarMenuLink" href="https://tencent.github.io/tmagic-editor/playground/index.html" target="_blank" rel="noreferrer" tabindex="0" data-v-ec5ae824 data-v-43d45074><!--[--><span data-v-43d45074>Playground</span><!--]--></a><!--]--><!--]--></nav><!----><div class="VPNavBarAppearance appearance" data-v-e3720e23 data-v-6416f7b5><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-6416f7b5 data-v-7ddf7f6f data-v-8006726c><span class="check" data-v-8006726c><span class="icon" data-v-8006726c><!--[--><span class="vpi-sun sun" data-v-7ddf7f6f></span><span class="vpi-moon moon" data-v-7ddf7f6f></span><!--]--></span></span></button></div><div class="VPSocialLinks VPNavBarSocialLinks social-links" data-v-e3720e23 data-v-77e51d27 data-v-03e62622><!--[--><a class="VPSocialLink no-icon" href="https://github.com/Tencent/tmagic-editor" aria-label="github" target="_blank" rel="me noopener" data-v-03e62622 data-v-e80c6f77><span class="vpi-social-github"></span></a><!--]--></div><div class="VPFlyout VPNavBarExtra extra" data-v-e3720e23 data-v-b1acd709 data-v-4b9197ed><button type="button" class="button" aria-haspopup="true" aria-expanded="false" aria-label="extra navigation" data-v-4b9197ed><span class="vpi-more-horizontal icon" data-v-4b9197ed></span></button><div class="menu" data-v-4b9197ed><div class="VPMenu" data-v-4b9197ed data-v-a395f093><!----><!--[--><!--[--><!----><div class="group" data-v-b1acd709><div class="item appearance" data-v-b1acd709><p class="label" data-v-b1acd709>Appearance</p><div class="appearance-action" data-v-b1acd709><button class="VPSwitch VPSwitchAppearance" type="button" role="switch" title aria-checked="false" data-v-b1acd709 data-v-7ddf7f6f data-v-8006726c><span class="check" data-v-8006726c><span class="icon" data-v-8006726c><!--[--><span class="vpi-sun sun" data-v-7ddf7f6f></span><span class="vpi-moon moon" data-v-7ddf7f6f></span><!--]--></span></span></button></div></div></div><div class="group" data-v-b1acd709><div class="item social-links" data-v-b1acd709><div class="VPSocialLinks social-links-list" data-v-b1acd709 data-v-03e62622><!--[--><a class="VPSocialLink no-icon" href="https://github.com/Tencent/tmagic-editor" aria-label="github" target="_blank" rel="me noopener" data-v-03e62622 data-v-e80c6f77><span class="vpi-social-github"></span></a><!--]--></div></div></div><!--]--><!--]--></div></div></div><!--[--><!--]--><button type="button" class="VPNavBarHamburger hamburger" aria-label="mobile navigation" aria-expanded="false" aria-controls="VPNavScreen" data-v-e3720e23 data-v-bd3703a2><span class="container" data-v-bd3703a2><span class="top" data-v-bd3703a2></span><span class="middle" data-v-bd3703a2></span><span class="bottom" data-v-bd3703a2></span></span></button></div></div></div></div><div class="divider" data-v-e3720e23><div class="divider-line" data-v-e3720e23></div></div></div><!----></header><div class="VPLocalNav has-sidebar empty" data-v-52085faa data-v-0d424459><div class="container" data-v-0d424459><button class="menu" aria-expanded="false" aria-controls="VPSidebarNav" data-v-0d424459><span class="vpi-align-left menu-icon" data-v-0d424459></span><span class="menu-text" data-v-0d424459>Menu</span></button><div class="VPLocalNavOutlineDropdown" style="--vp-vh:0px;" data-v-0d424459 data-v-9e866da0><button data-v-9e866da0>Return to top</button><!----></div></div></div><aside class="VPSidebar" data-v-52085faa data-v-b300e040><div class="curtain" data-v-b300e040></div><nav class="nav" id="VPSidebarNav" aria-labelledby="sidebar-aria-label" tabindex="-1" data-v-b300e040><span class="visually-hidden" id="sidebar-aria-label" data-v-b300e040> Sidebar Navigation </span><!--[--><!--]--><!--[--><div class="no-transition group" data-v-cd5b1edc><section class="VPSidebarItem level-0 has-active" data-v-cd5b1edc data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h2 class="text" data-v-edbe517d>编辑器</h2><!----></div><div class="items" data-v-edbe517d><!--[--><section class="VPSidebarItem level-1" data-v-edbe517d data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h3 class="text" data-v-edbe517d>Editor组件</h3><!----></div><div class="items" data-v-edbe517d><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/props.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>props</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/slots.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>slots</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/events.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>events</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1" data-v-edbe517d data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h3 class="text" data-v-edbe517d>editorService</h3><!----></div><div class="items" data-v-edbe517d><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/editorServiceMethods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>方法</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/editorServiceEvents.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>事件</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1" data-v-edbe517d data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h3 class="text" data-v-edbe517d>propsService</h3><!----></div><div class="items" data-v-edbe517d><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/propsServiceMethods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>方法</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/propsServiceEvents.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>事件</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1 has-active" data-v-edbe517d data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h3 class="text" data-v-edbe517d>historyService</h3><!----></div><div class="items" data-v-edbe517d><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/historyServiceMethods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>方法</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/historyServiceEvents.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>事件</p><!--]--></a><!----></div><!----></div><!--]--></div></section><div class="VPSidebarItem level-1 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/eventsServiceMethods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>eventsService</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/uiServiceMethods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>uiService</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/codeBlockServiceMethods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>codeBlockService</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/componentListServiceMethods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>componentListService</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-1 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/editor/storageServiceMethods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>storageService</p><!--]--></a><!----></div><!----></div><!--]--></div></section></div><div class="no-transition group" data-v-cd5b1edc><section class="VPSidebarItem level-0" data-v-cd5b1edc data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h2 class="text" data-v-edbe517d>表单</h2><!----></div><div class="items" data-v-edbe517d><!--[--><section class="VPSidebarItem level-1" data-v-edbe517d data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h3 class="text" data-v-edbe517d>Form组件</h3><!----></div><div class="items" data-v-edbe517d><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/form/form-props.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>props</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/form/form-methods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>methods</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/form/form-events.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>events</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1" data-v-edbe517d data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h3 class="text" data-v-edbe517d>FormDialog组件</h3><!----></div><div class="items" data-v-edbe517d><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/form/form-dialog-props.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>props</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/form/form-dialog-methods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>methods</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/form/form-dialog-events.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>events</p><!--]--></a><!----></div><!----></div><!--]--></div></section><section class="VPSidebarItem level-1" data-v-edbe517d data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h3 class="text" data-v-edbe517d>工具函数</h3><!----></div><div class="items" data-v-edbe517d><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/form/submit-form.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>submitForm</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-cd5b1edc><section class="VPSidebarItem level-0" data-v-cd5b1edc data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h2 class="text" data-v-edbe517d>表格</h2><!----></div><div class="items" data-v-edbe517d><!--[--><section class="VPSidebarItem level-1" data-v-edbe517d data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h3 class="text" data-v-edbe517d>Table组件</h3><!----></div><div class="items" data-v-edbe517d><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/table/props.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>props</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/table/methods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>methods</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/table/events.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>events</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><div class="no-transition group" data-v-cd5b1edc><section class="VPSidebarItem level-0" data-v-cd5b1edc data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h2 class="text" data-v-edbe517d>stage</h2><!----></div><div class="items" data-v-edbe517d><!--[--><section class="VPSidebarItem level-1" data-v-edbe517d data-v-edbe517d><div class="item" role="button" tabindex="0" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><h3 class="text" data-v-edbe517d>StageCore</h3><!----></div><div class="items" data-v-edbe517d><!--[--><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/stage/coreMethods.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>方法</p><!--]--></a><!----></div><!----></div><div class="VPSidebarItem level-2 is-link" data-v-edbe517d data-v-edbe517d><div class="item" data-v-edbe517d><div class="indicator" data-v-edbe517d></div><a class="VPLink link link" href="/tmagic-editor/docs/api/stage/coreEvents.html" data-v-edbe517d><!--[--><p class="text" data-v-edbe517d>事件</p><!--]--></a><!----></div><!----></div><!--]--></div></section><!--]--></div></section></div><!--]--><!--[--><!--]--></nav></aside><div class="VPContent has-sidebar" id="VPContent" data-v-52085faa data-v-e4a435e4><div class="VPDoc has-sidebar has-aside" data-v-e4a435e4 data-v-e240b221><!--[--><!--]--><div class="container" data-v-e240b221><div class="aside" data-v-e240b221><div class="aside-curtain" data-v-e240b221></div><div class="aside-container" data-v-e240b221><div class="aside-content" data-v-e240b221><div class="VPDocAside" data-v-e240b221 data-v-29ae77ab><!--[--><!--]--><!--[--><!--]--><nav aria-labelledby="doc-outline-aria-label" class="VPDocAsideOutline" data-v-29ae77ab data-v-9a0a5036><div class="content" data-v-9a0a5036><div class="outline-marker" data-v-9a0a5036></div><div aria-level="2" class="outline-title" id="doc-outline-aria-label" role="heading" data-v-9a0a5036>On this page</div><ul class="VPDocOutlineItem root" data-v-9a0a5036 data-v-97ea2a1e><!--[--><!--]--></ul></div></nav><!--[--><!--]--><div class="spacer" data-v-29ae77ab></div><!--[--><!--]--><!----><!--[--><!--]--><!--[--><!--]--></div></div></div></div><div class="content" data-v-e240b221><div class="content-container" data-v-e240b221><!--[--><!--]--><main class="main" data-v-e240b221><div style="position:relative;" class="vp-doc _tmagic-editor_docs_api_editor_historyServiceMethods" data-v-e240b221><div><h1 id="historyservice方法" tabindex="-1">historyService方法 <a class="header-anchor" href="#historyservice方法" aria-label="Permalink to “historyService方法”"></a></h1><h2 id="reset" tabindex="-1">reset <a class="header-anchor" href="#reset" aria-label="Permalink to “reset”"></a></h2><ul><li><p><strong>详情:</strong></p><p>重置全部历史记录(包括页面节点栈、代码块栈、数据源栈),并重置当前页面 id / canRedo / canUndo</p></li></ul><h2 id="resetpage" tabindex="-1">resetPage <a class="header-anchor" href="#resetpage" aria-label="Permalink to “resetPage”"></a></h2><ul><li><p><strong>详情:</strong></p><p>重置当前页面的历史记录状态清空当前页面id重置 canRedo/canUndo</p></li></ul><h2 id="resetstate" tabindex="-1">resetState <a class="header-anchor" href="#resetstate" aria-label="Permalink to “resetState”"></a></h2><ul><li><p><strong>详情:</strong></p><p>重置历史记录全部内部状态(清空 pageId、pageSteps、canRedo、canUndo、codeBlockState、dataSourceState</p></li></ul><h2 id="changepage" tabindex="-1">changePage <a class="header-anchor" href="#changepage" aria-label="Permalink to “changePage”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{MPage | MPageFragment} page</code></li></ul><details class="details custom-block"><summary>查看 MPage / MPageFragment 类型定义</summary><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MPage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MContainer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 页面类型 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> type</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> NodeType</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">PAGE</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MPageFragment</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> extends</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MContainer</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 页面类型 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> type</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> NodeType</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">.</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">PAGE_FRAGMENT</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></details></li><li><p><strong>详情:</strong></p><p>按页面切换历史堆栈</p></li></ul><h2 id="push" tabindex="-1">push <a class="header-anchor" href="#push" aria-label="Permalink to “push”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{StepValue} state</code></li></ul><details class="details custom-block"><summary>查看 StepValue 及关联类型定义</summary><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> StepValue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 页面信息 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> data</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> };</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> opType</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> HistoryOpType</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 操作前选中的节点 ID用于撤销后恢复选择状态 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> selectedBefore</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[];</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 操作后选中的节点 ID用于重做后恢复选择状态 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> selectedAfter</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[];</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> modifiedNodeIds</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Map</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">Id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** opType &#39;add&#39;: 新增的节点 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> nodes</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MNode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[];</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** opType &#39;add&#39;: 父节点 ID */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> parentId</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** opType &#39;add&#39;: 每个新增节点在父节点 items 中的索引 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> indexMap</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Record</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&lt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">, </span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">&gt;;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** opType &#39;remove&#39;: 被删除的节点及其位置信息 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> removedItems</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">node</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MNode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">parentId</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">index</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> }[];</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * opType &#39;update&#39;: 变更前后的节点快照</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * `changeRecords` 来自 form 端的 propPath/value 列表,撤销/重做时只对这些 propPath 做局部更新;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 缺省(未传 / 空数组)才退化为整节点替换。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> updatedItems</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> { </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">oldNode</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MNode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">newNode</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MNode</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">; </span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">changeRecords</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> ChangeRecord</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[] }[];</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 调用方可选传入的人类可读描述(如「调整按钮颜色」),用于历史面板展示。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 不影响 undo/redo 行为;缺省时面板会根据节点 / propPath 自动生成描述。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> historyDescription</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 操作途径:标记本次变更由哪条交互入口触发,取值见 </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">{</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">@link</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> HistoryOpSource</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">}</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * (画布 / 树面板 / 组件面板 / 配置面板 / 源码编辑器 / 右键菜单 / 工具栏 / 快捷键 / 回滚 / 接口 等)。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 仅用于历史面板展示与业务埋点,不影响 undo/redo 行为;缺省时面板视为「未知」。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> HistoryOpSource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 入栈时间戳(毫秒)。在 historyService.push 时自动写入(若调用方未指定),仅用于历史面板展示。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> HistoryOpType</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;add&#39;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;remove&#39;</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;update&#39;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 历史记录的「操作途径」——标记本次变更由哪条交互入口触发,仅用于历史面板展示 / 业务埋点,</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 不影响 undo/redo 行为。缺省(未传)时 UI 视为「未知」。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `stage`:画布(拖拽 / 缩放 / 排序等舞台直接操作)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `tree`:树形面板(图层 / 数据源 / 代码块等树形结构里的拖拽 / 菜单操作)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `component-panel`:组件面板(左侧组件列表点击 / 拖拽新增组件)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `props`:配置面板表单(属性表单字段编辑)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `code`:源码编辑器(配置面板「源码」面板里直接编辑 JSON/代码后保存)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `stage-contextmenu`:画布右键菜单(舞台上节点的右键上下文菜单)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `tree-contextmenu`:树面板右键菜单(图层 / 数据源 / 代码块等树形列表上的右键上下文菜单)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `toolbar`:工具栏菜单(顶部导航工具栏按钮)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `shortcut`:键盘快捷键</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `rollback`:历史回滚(历史面板里对某条历史「回滚」,反向应用为一条新记录,类 git revert</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `api`:代码 / 接口调用(程序化触发)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `ai`AI 生成 / 智能助手触发的变更</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `unknown`:未知来源</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 通过 `(string &amp; {})` 允许业务侧扩展自定义途径字符串,同时保留内置值的自动补全。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> HistoryOpSource</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;stage&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;tree&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;component-panel&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;props&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;code&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;stage-contextmenu&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;tree-contextmenu&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;toolbar&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;shortcut&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;rollback&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;api&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;ai&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;unknown&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">string</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {});</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MNode</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MComponent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MContainer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MIteratorContainer</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MPage</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MApp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> MPageFragment</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> ChangeRecord</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> propPath</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></details></li><li><p><strong>返回:</strong></p><ul><li><code>{StepValue | null}</code></li></ul></li><li><p><strong>详情:</strong></p><p>添加一条历史记录</p><div class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p><p><code>opType: &#39;update&#39;</code> 的每个 <code>updatedItems[i]</code> 上可携带 <code>changeRecords</code>,用于撤销 / 重做时仅按 <code>propPath</code> 局部更新对应字段,避免整节点替换冲掉同节点上的其它无关变更;不带 <code>changeRecords</code> 时退化为整节点替换(如 <code>sort</code> / <code>moveLayer</code> / 拖动等纯快照场景)。</p><p><code>StepValue</code> 上的 <code>historyDescription</code> / <code>source</code> 仅用于历史面板展示与埋点,不影响 undo/redo 行为。</p></div></li></ul><h2 id="undo" tabindex="-1">undo <a class="header-anchor" href="#undo" aria-label="Permalink to “undo”"></a></h2><ul><li><p><strong>返回:</strong></p><ul><li><code>{StepValue | null}</code></li></ul></li><li><p><strong>详情:</strong></p><p>撤销当前操作。<code>opType: &#39;update&#39;</code> 时,若 <code>updatedItems[i].changeRecords</code> 存在,会按 <code>propPath</code><code>oldNode</code> 取值做局部回滚;否则用 <code>oldNode</code> 整节点替换。</p></li></ul><h2 id="redo" tabindex="-1">redo <a class="header-anchor" href="#redo" aria-label="Permalink to “redo”"></a></h2><ul><li><p><strong>返回:</strong></p><ul><li><code>{StepValue | null}</code></li></ul></li><li><p><strong>详情:</strong></p><p>恢复到下一步。<code>opType: &#39;update&#39;</code> 时,若 <code>updatedItems[i].changeRecords</code> 存在,会按 <code>propPath</code><code>newNode</code> 取值做局部重做;否则用 <code>newNode</code> 整节点替换。</p></li></ul><h2 id="pushcodeblock" tabindex="-1">pushCodeBlock <a class="header-anchor" href="#pushcodeblock" aria-label="Permalink to “pushCodeBlock”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{Id} codeBlockId</code> 代码块 id</li><li><code>{Object} payload</code><ul><li><code>{CodeBlockContent | null} oldContent</code> 变更前的代码块内容;新增时为 <code>null</code></li><li><code>{CodeBlockContent | null} newContent</code> 变更后的代码块内容;删除时为 <code>null</code></li><li><code>{ChangeRecord[]} changeRecords</code> 可选form 端 propPath/value 变更列表,撤销/重做时若有则按 propPath 局部更新;缺省(或空数组)才退化为整内容替换</li><li><code>{string}</code> historyDescription 可选;人类可读描述,用于历史面板展示;不影响 undo/redo 行为</li><li><code>{HistoryOpSource}</code> source 可选;操作途径,用于历史面板展示与埋点;不影响 undo/redo 行为</li></ul></li></ul><details class="details custom-block"><summary>查看 CodeBlockStepValue 及关联类型定义</summary><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 代码块历史记录条目。按 codeBlock.id 分组保存到 historyState.codeBlockState。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - 新增oldContent = nullnewContent = 新内容</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - 更新oldContent / newContent 都为对应内容</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - 删除newContent = nulloldContent = 删除前内容</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> CodeBlockStepValue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 关联的代码块 id */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 变更前的代码块内容,新增时为 null */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> oldContent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> CodeBlockContent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 变更后的代码块内容,删除时为 null */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> newContent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> CodeBlockContent</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * form 端 propPath/value 列表。撤销/重做时若有则按 propPath 局部更新;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 缺省才退化为整内容替换。新增/删除场景通常无 changeRecords。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> changeRecords</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> ChangeRecord</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[];</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 调用方可选传入的人类可读描述,用于历史面板展示;不影响 undo/redo 行为。 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> historyDescription</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 操作途径:标记本次变更由哪条交互入口触发,取值见 </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">{</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">@link</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> HistoryOpSource</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">}</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">;仅用于历史面板展示与埋点,不影响 undo/redo 行为。 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> HistoryOpSource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 入栈时间戳(毫秒),入栈时自动写入,仅用于历史面板展示。 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 历史记录的「操作途径」——标记本次变更由哪条交互入口触发,仅用于历史面板展示 / 业务埋点,</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 不影响 undo/redo 行为。缺省(未传)时 UI 视为「未知」。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `stage`:画布(拖拽 / 缩放 / 排序等舞台直接操作)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `tree`:树形面板(图层 / 数据源 / 代码块等树形结构里的拖拽 / 菜单操作)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `component-panel`:组件面板(左侧组件列表点击 / 拖拽新增组件)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `props`:配置面板表单(属性表单字段编辑)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `code`:源码编辑器(配置面板「源码」面板里直接编辑 JSON/代码后保存)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `stage-contextmenu`:画布右键菜单(舞台上节点的右键上下文菜单)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `tree-contextmenu`:树面板右键菜单(图层 / 数据源 / 代码块等树形列表上的右键上下文菜单)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `toolbar`:工具栏菜单(顶部导航工具栏按钮)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `shortcut`:键盘快捷键</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `rollback`:历史回滚(历史面板里对某条历史「回滚」,反向应用为一条新记录,类 git revert</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `api`:代码 / 接口调用(程序化触发)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `ai`AI 生成 / 智能助手触发的变更</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `unknown`:未知来源</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 通过 `(string &amp; {})` 允许业务侧扩展自定义途径字符串,同时保留内置值的自动补全。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> HistoryOpSource</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;stage&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;tree&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;component-panel&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;props&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;code&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;stage-contextmenu&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;tree-contextmenu&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;toolbar&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;shortcut&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;rollback&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;api&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;ai&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;unknown&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">string</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {});</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> CodeBlockContent</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 代码块名称 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> name</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 代码块内容 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> content</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> ((</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">...</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">args</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[]) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">=&gt;</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Function</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 参数定义 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> params</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> CodeParam</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[] </span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">|</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [];</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 注释 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> desc</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 扩展字段 */</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> [</span><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;">propName</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">]</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> ChangeRecord</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> propPath</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></details></li><li><p><strong>返回:</strong></p><ul><li><code>{CodeBlockStepValue | null}</code> 入栈失败(未传 id时返回 <code>null</code></li></ul></li><li><p><strong>详情:</strong></p><p>推入一条代码块变更记录。与页面 / 节点完全无关,按 <code>codeBlockId</code> 维度独立一份 <code>UndoRedo</code> 栈, 栈实例存放在 <code>historyService.state.codeBlockState[codeBlockId]</code></p><p>入栈成功后会触发 <code>code-block-history-change</code> 事件。</p><div class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p><p><code>codeBlockService.setCodeDslByIdSync</code><code>codeBlockService.deleteCodeDslByIds</code> 内部已经 自动调用本方法,业务代码通常无需手动调用。</p></div></li></ul><h2 id="undocodeblock" tabindex="-1">undoCodeBlock <a class="header-anchor" href="#undocodeblock" aria-label="Permalink to “undoCodeBlock”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{Id} codeBlockId</code></li></ul></li><li><p><strong>返回:</strong></p><ul><li><code>{CodeBlockStepValue | null}</code> 栈不存在或已无可撤销记录时返回 <code>null</code></li></ul></li><li><p><strong>详情:</strong></p><p>撤销指定代码块的最近一次变更。成功时会触发 <code>code-block-history-change</code> 事件。 拿到 step 后由调用方根据 <code>step.oldContent</code> 写回 <code>codeBlockService</code>(本方法不会自动回放)。</p></li></ul><h2 id="redocodeblock" tabindex="-1">redoCodeBlock <a class="header-anchor" href="#redocodeblock" aria-label="Permalink to “redoCodeBlock”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{Id} codeBlockId</code></li></ul></li><li><p><strong>返回:</strong></p><ul><li><code>{CodeBlockStepValue | null}</code> 栈不存在或已无可重做记录时返回 <code>null</code></li></ul></li><li><p><strong>详情:</strong></p><p>重做指定代码块的下一次变更。成功时会触发 <code>code-block-history-change</code> 事件。</p></li></ul><h2 id="canundocodeblock" tabindex="-1">canUndoCodeBlock <a class="header-anchor" href="#canundocodeblock" aria-label="Permalink to “canUndoCodeBlock”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{Id} codeBlockId</code></li></ul></li><li><p><strong>返回:</strong></p><ul><li><code>{boolean}</code></li></ul></li><li><p><strong>详情:</strong></p><p>指定代码块当前是否可撤销。栈不存在时返回 <code>false</code></p></li></ul><h2 id="canredocodeblock" tabindex="-1">canRedoCodeBlock <a class="header-anchor" href="#canredocodeblock" aria-label="Permalink to “canRedoCodeBlock”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{Id} codeBlockId</code></li></ul></li><li><p><strong>返回:</strong></p><ul><li><code>{boolean}</code></li></ul></li><li><p><strong>详情:</strong></p><p>指定代码块当前是否可重做。栈不存在时返回 <code>false</code></p></li></ul><h2 id="pushdatasource" tabindex="-1">pushDataSource <a class="header-anchor" href="#pushdatasource" aria-label="Permalink to “pushDataSource”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{Id} dataSourceId</code> 数据源 id</li><li><code>{Object} payload</code><ul><li><code>{DataSourceSchema | null} oldSchema</code> 变更前的数据源 schema新增时为 <code>null</code></li><li><code>{DataSourceSchema | null} newSchema</code> 变更后的数据源 schema删除时为 <code>null</code></li><li><code>{ChangeRecord[]} changeRecords</code> 可选form 端 propPath/value 变更列表,撤销/重做时若有则按 propPath 局部更新;缺省(或空数组)才退化为整 schema 替换</li><li><code>{string}</code> historyDescription 可选;人类可读描述,用于历史面板展示;不影响 undo/redo 行为</li><li><code>{HistoryOpSource}</code> source 可选;操作途径,用于历史面板展示与埋点;不影响 undo/redo 行为</li></ul></li></ul><details class="details custom-block"><summary>查看 DataSourceStepValue 及关联类型定义</summary><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 数据源历史记录条目。按 dataSource.id 分组保存到 historyState.dataSourceState。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - 新增oldSchema = nullnewSchema = 新 schema</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - 更新oldSchema / newSchema 都为对应 schema</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - 删除newSchema = nulloldSchema = 删除前 schema</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> DataSourceStepValue</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 关联的数据源 id */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> id</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> Id</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 变更前的数据源 schema新增时为 null */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> oldSchema</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> DataSourceSchema</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 变更后的数据源 schema删除时为 null */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> newSchema</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> DataSourceSchema</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> null</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * form 端 propPath/value 列表。撤销/重做时若有则按 propPath 局部更新;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 缺省才退化为整 schema 替换。新增/删除场景通常无 changeRecords。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> changeRecords</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> ChangeRecord</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">[];</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 调用方可选传入的人类可读描述,用于历史面板展示;不影响 undo/redo 行为。 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> historyDescription</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 操作途径:标记本次变更由哪条交互入口触发,取值见 </span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">{</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">@link</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> HistoryOpSource</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;">}</span><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">;仅用于历史面板展示与埋点,不影响 undo/redo 行为。 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> source</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> HistoryOpSource</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> /** 入栈时间戳(毫秒),入栈时自动写入,仅用于历史面板展示。 */</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> timestamp</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> number</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;">/**</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 历史记录的「操作途径」——标记本次变更由哪条交互入口触发,仅用于历史面板展示 / 业务埋点,</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 不影响 undo/redo 行为。缺省(未传)时 UI 视为「未知」。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `stage`:画布(拖拽 / 缩放 / 排序等舞台直接操作)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `tree`:树形面板(图层 / 数据源 / 代码块等树形结构里的拖拽 / 菜单操作)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `component-panel`:组件面板(左侧组件列表点击 / 拖拽新增组件)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `props`:配置面板表单(属性表单字段编辑)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `code`:源码编辑器(配置面板「源码」面板里直接编辑 JSON/代码后保存)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `stage-contextmenu`:画布右键菜单(舞台上节点的右键上下文菜单)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `tree-contextmenu`:树面板右键菜单(图层 / 数据源 / 代码块等树形列表上的右键上下文菜单)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `toolbar`:工具栏菜单(顶部导航工具栏按钮)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `shortcut`:键盘快捷键</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `rollback`:历史回滚(历史面板里对某条历史「回滚」,反向应用为一条新记录,类 git revert</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `api`:代码 / 接口调用(程序化触发)</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `ai`AI 生成 / 智能助手触发的变更</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * - `unknown`:未知来源</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> *</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> * 通过 `(string &amp; {})` 允许业务侧扩展自定义途径字符串,同时保留内置值的自动补全。</span></span>
<span class="line"><span style="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> */</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> type</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> HistoryOpSource</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> =</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;stage&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;tree&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;component-panel&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;props&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;code&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;stage-contextmenu&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;tree-contextmenu&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;toolbar&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;shortcut&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;rollback&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;api&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;ai&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#032F62;--shiki-dark:#9ECBFF;"> &#39;unknown&#39;</span></span>
<span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> |</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">string</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> &amp;</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {});</span></span></code></pre></div><div class="language-ts"><button title="Copy Code" class="copy"></button><span class="lang">ts</span><pre class="shiki shiki-themes github-light github-dark" style="--shiki-light:#24292e;--shiki-dark:#e1e4e8;--shiki-light-bg:#fff;--shiki-dark-bg:#24292e;" tabindex="0" dir="ltr"><code><span class="line"><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">export</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;"> interface</span><span style="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> ChangeRecord</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> {</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> propPath</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">?:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> string</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> value</span><span style="--shiki-light:#D73A49;--shiki-dark:#F97583;">:</span><span style="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> any</span><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span></span>
<span class="line"><span style="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div></details></li><li><p><strong>返回:</strong></p><ul><li><code>{DataSourceStepValue | null}</code> 入栈失败(未传 id时返回 <code>null</code></li></ul></li><li><p><strong>详情:</strong></p><p>推入一条数据源变更记录。与页面 / 节点完全无关,按 <code>dataSourceId</code> 维度独立一份 <code>UndoRedo</code> 栈, 栈实例存放在 <code>historyService.state.dataSourceState[dataSourceId]</code></p><p>入栈成功后会触发 <code>data-source-history-change</code> 事件。</p><div class="tip custom-block"><p class="custom-block-title custom-block-title-default">TIP</p><p><code>dataSourceService.add</code> / <code>update</code> / <code>remove</code> 内部已经自动调用本方法,业务代码通常无需手动调用。</p></div></li></ul><h2 id="undodatasource" tabindex="-1">undoDataSource <a class="header-anchor" href="#undodatasource" aria-label="Permalink to “undoDataSource”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{Id} dataSourceId</code></li></ul></li><li><p><strong>返回:</strong></p><ul><li><code>{DataSourceStepValue | null}</code></li></ul></li><li><p><strong>详情:</strong></p><p>撤销指定数据源的最近一次变更。成功时会触发 <code>data-source-history-change</code> 事件。 拿到 step 后由调用方根据 <code>step.oldSchema</code> 写回 <code>dataSourceService</code>(本方法不会自动回放)。</p></li></ul><h2 id="redodatasource" tabindex="-1">redoDataSource <a class="header-anchor" href="#redodatasource" aria-label="Permalink to “redoDataSource”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{Id} dataSourceId</code></li></ul></li><li><p><strong>返回:</strong></p><ul><li><code>{DataSourceStepValue | null}</code></li></ul></li><li><p><strong>详情:</strong></p><p>重做指定数据源的下一次变更。成功时会触发 <code>data-source-history-change</code> 事件。</p></li></ul><h2 id="canundodatasource" tabindex="-1">canUndoDataSource <a class="header-anchor" href="#canundodatasource" aria-label="Permalink to “canUndoDataSource”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{Id} dataSourceId</code></li></ul></li><li><p><strong>返回:</strong></p><ul><li><code>{boolean}</code></li></ul></li><li><p><strong>详情:</strong></p><p>指定数据源当前是否可撤销。栈不存在时返回 <code>false</code></p></li></ul><h2 id="canredodatasource" tabindex="-1">canRedoDataSource <a class="header-anchor" href="#canredodatasource" aria-label="Permalink to “canRedoDataSource”"></a></h2><ul><li><p><strong>参数:</strong></p><ul><li><code>{Id} dataSourceId</code></li></ul></li><li><p><strong>返回:</strong></p><ul><li><code>{boolean}</code></li></ul></li><li><p><strong>详情:</strong></p><p>指定数据源当前是否可重做。栈不存在时返回 <code>false</code></p></li></ul><h2 id="destroy" tabindex="-1">destroy <a class="header-anchor" href="#destroy" aria-label="Permalink to “destroy”"></a></h2><ul><li><p><strong>详情:</strong></p><p>销毁</p></li></ul></div></div></main><footer class="VPDocFooter" data-v-e240b221 data-v-5ee03efa><!--[--><!--]--><!----><nav class="prev-next" aria-labelledby="doc-footer-aria-label" data-v-5ee03efa><span class="visually-hidden" id="doc-footer-aria-label" data-v-5ee03efa>Pager</span><div class="pager" data-v-5ee03efa><a class="VPLink link pager-link prev" href="/tmagic-editor/docs/api/editor/propsServiceEvents.html" data-v-5ee03efa><!--[--><span class="desc" data-v-5ee03efa>Previous page</span><span class="title" data-v-5ee03efa>事件</span><!--]--></a></div><div class="pager" data-v-5ee03efa><a class="VPLink link pager-link next" href="/tmagic-editor/docs/api/editor/historyServiceEvents.html" data-v-5ee03efa><!--[--><span class="desc" data-v-5ee03efa>Next page</span><span class="title" data-v-5ee03efa>事件</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><footer class="VPFooter has-sidebar" data-v-52085faa data-v-b8960fa3><div class="container" data-v-b8960fa3><p class="message" data-v-b8960fa3>Powered by 腾讯视频会员平台技术中心</p><p class="copyright" data-v-b8960fa3>Copyright (C) 2025 Tencent.</p></div></footer><!--[--><!--]--></div></div>
<script>window.__VP_HASH_MAP__=JSON.parse("{\"api_editor_codeblockservicemethods.md\":\"C_PneqGf\",\"api_editor_componentlistservicemethods.md\":\"NIwatNAh\",\"api_editor_datasourceservicemethods.md\":\"BMf5I58e\",\"api_editor_editorserviceevents.md\":\"DkdzACfI\",\"api_editor_editorservicemethods.md\":\"DPIOaqjV\",\"api_editor_events.md\":\"Dsc4NqMg\",\"api_editor_eventsservicemethods.md\":\"Bw1rmuNy\",\"api_editor_historyserviceevents.md\":\"CtunHpDp\",\"api_editor_historyservicemethods.md\":\"vIXypc6c\",\"api_editor_props.md\":\"Bqc-msOe\",\"api_editor_propsserviceevents.md\":\"CznK704B\",\"api_editor_propsservicemethods.md\":\"CHnpUlWe\",\"api_editor_slots.md\":\"B1B73apK\",\"api_editor_storageservicemethods.md\":\"XM0kc8xb\",\"api_editor_uiservicemethods.md\":\"CaCmG806\",\"api_form_form-dialog-events.md\":\"Bsi7I9tr\",\"api_form_form-dialog-methods.md\":\"B_sgIgX8\",\"api_form_form-dialog-props.md\":\"BfYnG4uw\",\"api_form_form-events.md\":\"C8SsDKZ6\",\"api_form_form-methods.md\":\"aycnh5FX\",\"api_form_form-props.md\":\"CnIXk9AC\",\"api_form_submit-form.md\":\"BkueFK3n\",\"api_stage_coreevents.md\":\"Cgw_NWIw\",\"api_stage_coremethods.md\":\"BfJZoQ1-\",\"api_table_events.md\":\"ANzBnLY7\",\"api_table_methods.md\":\"DKsUhNyQ\",\"api_table_props.md\":\"8p93oj03\",\"form-config_compare.md\":\"BmhAWdnU\",\"form-config_editor-fields_code-link.md\":\"_WpUScRP\",\"form-config_editor-fields_code-select-col.md\":\"5v2NiQs-\",\"form-config_editor-fields_code-select.md\":\"tFuJKxmz\",\"form-config_editor-fields_code.md\":\"QLtMzjkL\",\"form-config_editor-fields_cond-op-select.md\":\"DuVk7Plf\",\"form-config_editor-fields_data-source-field-select.md\":\"l-mtFHlA\",\"form-config_editor-fields_data-source-fields.md\":\"DuPucaNA\",\"form-config_editor-fields_data-source-input.md\":\"Cls0ZVmf\",\"form-config_editor-fields_data-source-method-select.md\":\"BQ9ihZav\",\"form-config_editor-fields_data-source-methods.md\":\"D4eLoaZh\",\"form-config_editor-fields_data-source-mocks.md\":\"BxEpd6-f\",\"form-config_editor-fields_data-source-select.md\":\"BeMf8tjW\",\"form-config_editor-fields_display-conds.md\":\"DthLWdef\",\"form-config_editor-fields_event-select.md\":\"Ct78kypt\",\"form-config_editor-fields_key-value.md\":\"BBSWwoHC\",\"form-config_editor-fields_page-fragment-select.md\":\"C4a_ieVQ\",\"form-config_editor-fields_ui-select.md\":\"DeBRlgMj\",\"form-config_fields_cascader.md\":\"Ad-9vSWz\",\"form-config_fields_checkbox.md\":\"DA3EU5r9\",\"form-config_fields_color-picker.md\":\"ChtAlvyA\",\"form-config_fields_date-picker.md\":\"BLpndPyR\",\"form-config_fields_daterange-picker.md\":\"BeDfHdP5\",\"form-config_fields_datetime-picker.md\":\"DKx6HjF1\",\"form-config_fields_display.md\":\"FpktLnh9\",\"form-config_fields_dynamic-field.md\":\"D-qL57IR\",\"form-config_fields_hidden.md\":\"CwIk9R6T\",\"form-config_fields_link.md\":\"CZP0Pwde\",\"form-config_fields_number-range.md\":\"D9w-K4YH\",\"form-config_fields_number.md\":\"BP6zDFhk\",\"form-config_fields_radio.md\":\"fpqLi6D8\",\"form-config_fields_select.md\":\"Busav8N-\",\"form-config_fields_switch.md\":\"CDph7J3q\",\"form-config_fields_text.md\":\"DSP7CO2W\",\"form-config_fields_textarea.md\":\"Cil4hAqw\",\"form-config_fields_time-picker.md\":\"BIgdvB4T\",\"form-config_fields_timerange-picker.md\":\"kRMAFTrr\",\"form-config_layout.md\":\"BQhGI4Qq\",\"form-config_relate.md\":\"DvsbvOrz\",\"guide_advanced_code-block.md\":\"CRnQiSUe\",\"guide_advanced_coupling.md\":\"QzzEWi8z\",\"guide_advanced_data-source.md\":\"aV48AJ93\",\"guide_advanced_history-list.md\":\"DiAyWX3H\",\"guide_advanced_js-schema.md\":\"DXahSd8l\",\"guide_advanced_layout.md\":\"m3-E5MCg\",\"guide_advanced_page.md\":\"DtD6IjTT\",\"guide_advanced_tmagic-form.md\":\"BGo1HV71\",\"guide_component.md\":\"ClwHnKxy\",\"guide_conception.md\":\"BvWRTJve\",\"guide_editor-expand.md\":\"DPpw0fx9\",\"guide_index.md\":\"C9UYRlPd\",\"guide_introduction.md\":\"D4FioLjl\",\"guide_migration.md\":\"Ce1OLlPP\",\"guide_publish.md\":\"BkTaAJA2\",\"guide_runtime.md\":\"JZ9evVO4\",\"guide_tutorial_hello-world.md\":\"D89qcYij\",\"guide_tutorial_index.md\":\"CHgYShbW\",\"guide_tutorial_render.md\":\"Ck2bd1u7\",\"guide_tutorial_runtime.md\":\"CSNPMbNQ\",\"index.md\":\"yV4-lxaL\",\"runtime-api_core_app.md\":\"DvMcbTo5\",\"runtime-api_core_devtoolapi.md\":\"Dt64oZTL\",\"runtime-api_core_env.md\":\"BWNcvewl\",\"runtime-api_core_eventhelper.md\":\"CTcULNOH\",\"runtime-api_core_flowstate.md\":\"B4jkAJTv\",\"runtime-api_core_iteratorcontainer.md\":\"BOxfQgFl\",\"runtime-api_core_node.md\":\"DLCapBPL\",\"runtime-api_core_page.md\":\"Bzc2uHYw\",\"runtime-api_core_utils.md\":\"WYx95Kix\",\"runtime-api_data-source_datasource.md\":\"DiemAPn7\",\"runtime-api_data-source_datasourcemanager.md\":\"eR5GBSIC\",\"runtime-api_data-source_httpdatasource.md\":\"D3tOijZy\",\"runtime-api_data-source_observeddata.md\":\"Dvqp1Z-P\",\"runtime-api_data-source_utils.md\":\"Be3cnv3y\"}");window.__VP_SITE_DATA__=JSON.parse("{\"lang\":\"en-US\",\"dir\":\"ltr\",\"title\":\"tmagic-editor\",\"description\":\"页面可视化平台\",\"base\":\"/tmagic-editor/docs/\",\"head\":[],\"router\":{\"prefetchLinks\":true},\"appearance\":true,\"themeConfig\":{\"logo\":\"./favicon.png\",\"search\":{\"provider\":\"local\"},\"socialLinks\":[{\"icon\":\"github\",\"link\":\"https://github.com/Tencent/tmagic-editor\"}],\"footer\":{\"message\":\"Powered by 腾讯视频会员平台技术中心\",\"copyright\":\"Copyright (C) 2025 Tencent.\"},\"nav\":[{\"text\":\"文档\",\"link\":\"/guide/\",\"activeMatch\":\"/guide/\"},{\"text\":\"Editor API\",\"link\":\"/api/editor/props\",\"activeMatch\":\"/api/\"},{\"text\":\"Runtime API\",\"link\":\"/runtime-api/core/app\",\"activeMatch\":\"/runtime-api/\"},{\"text\":\"表单配置\",\"link\":\"/form-config/fields/text\",\"activeMatch\":\"/form-config/\"},{\"text\":\"更新日志\",\"link\":\"https://github.com/Tencent/tmagic-editor/releases\"},{\"text\":\"Playground\",\"link\":\"https://tencent.github.io/tmagic-editor/playground/index.html\"}],\"sidebar\":{\"/guide/\":[{\"text\":\"文档\",\"items\":[{\"text\":\"介绍\",\"link\":\"/guide/introduction.md\"},{\"text\":\"快速开始\",\"link\":\"/guide/\"},{\"text\":\"RUNTIME\",\"link\":\"/guide/runtime.md\"},{\"text\":\"组件开发\",\"link\":\"/guide/component.md\"},{\"text\":\"基础概念\",\"link\":\"/guide/conception.md\"},{\"text\":\"页面发布\",\"link\":\"/guide/publish.md\"},{\"text\":\"编辑器扩展\",\"link\":\"/guide/editor-expand.md\"},{\"text\":\"升级到1.5.x\",\"link\":\"/guide/migration.md\"}]},{\"text\":\"进阶指南\",\"items\":[{\"text\":\"JS Schema\",\"link\":\"/guide/advanced/js-schema.md\"},{\"text\":\"布局原理\",\"link\":\"/guide/advanced/layout.md\"},{\"text\":\"页面渲染\",\"link\":\"/guide/advanced/page.md\"},{\"text\":\"联动原理\",\"link\":\"/guide/advanced/coupling.md\"},{\"text\":\"代码块\",\"link\":\"/guide/advanced/code-block.md\"},{\"text\":\"数据源\",\"link\":\"/guide/advanced/data-source.md\"},{\"text\":\"历史记录面板\",\"link\":\"/guide/advanced/history-list.md\"},{\"text\":\"@tmagic/form\",\"link\":\"/guide/advanced/tmagic-form.md\"}]},{\"text\":\"教程\",\"items\":[{\"text\":\"写在前面\",\"link\":\"/guide/tutorial/\"},{\"text\":\"1.Hello World\",\"link\":\"/guide/tutorial/hello-world.md\"},{\"text\":\"2.Runtime\",\"link\":\"/guide/tutorial/runtime.md\"},{\"text\":\"3.DSL解析渲染\",\"link\":\"/guide/tutorial/render.md\"}]}],\"/api/\":[{\"text\":\"编辑器\",\"items\":[{\"text\":\"Editor组件\",\"items\":[{\"text\":\"props\",\"link\":\"/api/editor/props.md\"},{\"text\":\"slots\",\"link\":\"/api/editor/slots.md\"},{\"text\":\"events\",\"link\":\"/api/editor/events.md\"}]},{\"text\":\"editorService\",\"items\":[{\"text\":\"方法\",\"link\":\"/api/editor/editorServiceMethods.md\"},{\"text\":\"事件\",\"link\":\"/api/editor/editorServiceEvents.md\"}]},{\"text\":\"propsService\",\"items\":[{\"text\":\"方法\",\"link\":\"/api/editor/propsServiceMethods.md\"},{\"text\":\"事件\",\"link\":\"/api/editor/propsServiceEvents.md\"}]},{\"text\":\"historyService\",\"items\":[{\"text\":\"方法\",\"link\":\"/api/editor/historyServiceMethods.md\"},{\"text\":\"事件\",\"link\":\"/api/editor/historyServiceEvents.md\"}]},{\"text\":\"eventsService\",\"link\":\"/api/editor/eventsServiceMethods.md\"},{\"text\":\"uiService\",\"link\":\"/api/editor/uiServiceMethods.md\"},{\"text\":\"codeBlockService\",\"link\":\"/api/editor/codeBlockServiceMethods.md\"},{\"text\":\"componentListService\",\"link\":\"/api/editor/componentListServiceMethods.md\"},{\"text\":\"storageService\",\"link\":\"/api/editor/storageServiceMethods.md\"}]},{\"text\":\"表单\",\"items\":[{\"text\":\"Form组件\",\"items\":[{\"text\":\"props\",\"link\":\"/api/form/form-props\"},{\"text\":\"methods\",\"link\":\"/api/form/form-methods\"},{\"text\":\"events\",\"link\":\"/api/form/form-events\"}]},{\"text\":\"FormDialog组件\",\"items\":[{\"text\":\"props\",\"link\":\"/api/form/form-dialog-props\"},{\"text\":\"methods\",\"link\":\"/api/form/form-dialog-methods\"},{\"text\":\"events\",\"link\":\"/api/form/form-dialog-events\"}]},{\"text\":\"工具函数\",\"items\":[{\"text\":\"submitForm\",\"link\":\"/api/form/submit-form\"}]}]},{\"text\":\"表格\",\"items\":[{\"text\":\"Table组件\",\"items\":[{\"text\":\"props\",\"link\":\"/api/table/props\"},{\"text\":\"methods\",\"link\":\"/api/table/methods\"},{\"text\":\"events\",\"link\":\"/api/table/events\"}]}]},{\"text\":\"stage\",\"items\":[{\"text\":\"StageCore\",\"items\":[{\"text\":\"方法\",\"link\":\"/api/stage/coreMethods\"},{\"text\":\"事件\",\"link\":\"/api/stage/coreEvents\"}]}]}],\"/form-config/\":[{\"text\":\"基础配置\",\"items\":[{\"text\":\"Input输入框\",\"link\":\"/form-config/fields/text.md\"},{\"text\":\"Textarea文本域\",\"link\":\"/form-config/fields/textarea.md\"},{\"text\":\"InputNumber计数器\",\"link\":\"/form-config/fields/number.md\"},{\"text\":\"NumberRange数字范围\",\"link\":\"/form-config/fields/number-range.md\"},{\"text\":\"Display只读文本\",\"link\":\"/form-config/fields/display.md\"},{\"text\":\"Hidden隐藏域\",\"link\":\"/form-config/fields/hidden.md\"},{\"text\":\"Link链接\",\"link\":\"/form-config/fields/link.md\"},{\"text\":\"Checkbox多选框\",\"link\":\"/form-config/fields/checkbox.md\"},{\"text\":\"Radio单选框\",\"link\":\"/form-config/fields/radio.md\"},{\"text\":\"Switch开关\",\"link\":\"/form-config/fields/switch.md\"},{\"text\":\"Select选择器\",\"link\":\"/form-config/fields/select.md\"},{\"text\":\"Cascader级联选择器\",\"link\":\"/form-config/fields/cascader.md\"},{\"text\":\"ColorPicker颜色选择器\",\"link\":\"/form-config/fields/color-picker.md\"},{\"text\":\"DatePick日期选择器\",\"link\":\"/form-config/fields/date-picker.md\"},{\"text\":\"DateRangePick日期范围选择器\",\"link\":\"/form-config/fields/daterange-picker.md\"},{\"text\":\"DatetimePick日期时间选择器\",\"link\":\"/form-config/fields/datetime-picker.md\"},{\"text\":\"TimePick时间选择器\",\"link\":\"/form-config/fields/time-picker.md\"},{\"text\":\"TimeRangePick时间范围选择器\",\"link\":\"/form-config/fields/timerange-picker.md\"},{\"text\":\"DynamicField动态表单\",\"link\":\"/form-config/fields/dynamic-field.md\"}]},{\"text\":\"编辑器中可用配置\",\"items\":[{\"text\":\"Code代码编辑器\",\"link\":\"/form-config/editor-fields/code.md\"},{\"text\":\"CodeLink代码链接\",\"link\":\"/form-config/editor-fields/code-link.md\"},{\"text\":\"CodeSelect代码块选择器\",\"link\":\"/form-config/editor-fields/code-select.md\"},{\"text\":\"CodeSelectCol代码块选择列\",\"link\":\"/form-config/editor-fields/code-select-col.md\"},{\"text\":\"DataSourceSelect数据源选择器\",\"link\":\"/form-config/editor-fields/data-source-select.md\"},{\"text\":\"DataSourceFieldSelect数据源字段选择器\",\"link\":\"/form-config/editor-fields/data-source-field-select.md\"},{\"text\":\"DataSourceMethodSelect数据源方法选择器\",\"link\":\"/form-config/editor-fields/data-source-method-select.md\"},{\"text\":\"DataSourceFields数据源字段配置\",\"link\":\"/form-config/editor-fields/data-source-fields.md\"},{\"text\":\"DataSourceInput数据源输入框\",\"link\":\"/form-config/editor-fields/data-source-input.md\"},{\"text\":\"DataSourceMethods数据源方法配置\",\"link\":\"/form-config/editor-fields/data-source-methods.md\"},{\"text\":\"DataSourceMocks数据源Mock配置\",\"link\":\"/form-config/editor-fields/data-source-mocks.md\"},{\"text\":\"UISelect组件选择器\",\"link\":\"/form-config/editor-fields/ui-select.md\"},{\"text\":\"KeyValue键值对\",\"link\":\"/form-config/editor-fields/key-value.md\"},{\"text\":\"PageFragmentSelect页面片选择器\",\"link\":\"/form-config/editor-fields/page-fragment-select.md\"},{\"text\":\"EventSelect事件选择器\",\"link\":\"/form-config/editor-fields/event-select.md\"},{\"text\":\"DisplayConds显示条件配置\",\"link\":\"/form-config/editor-fields/display-conds.md\"},{\"text\":\"CondOpSelect条件操作选择器\",\"link\":\"/form-config/editor-fields/cond-op-select.md\"}]},{\"text\":\"布局配置\",\"items\":[{\"text\":\"布局\",\"link\":\"/form-config/layout.md\"}]},{\"text\":\"联动配置\",\"items\":[{\"text\":\"联动\",\"link\":\"/form-config/relate.md\"}]},{\"text\":\"表单对比\",\"items\":[{\"text\":\"表单对比\",\"link\":\"/form-config/compare.md\"}]}],\"/runtime-api/\":[{\"text\":\"@tmagic/core\",\"items\":[{\"text\":\"App\",\"link\":\"/runtime-api/core/app\"},{\"text\":\"Node\",\"link\":\"/runtime-api/core/node\"},{\"text\":\"Page\",\"link\":\"/runtime-api/core/page\"},{\"text\":\"EventHelper\",\"link\":\"/runtime-api/core/eventHelper\"},{\"text\":\"Env\",\"link\":\"/runtime-api/core/env\"},{\"text\":\"IteratorContainer\",\"link\":\"/runtime-api/core/iteratorContainer\"},{\"text\":\"FlowState\",\"link\":\"/runtime-api/core/flowState\"},{\"text\":\"DevtoolApi\",\"link\":\"/runtime-api/core/devtoolApi\"},{\"text\":\"工具函数\",\"link\":\"/runtime-api/core/utils\"}]},{\"text\":\"@tmagic/data-source\",\"items\":[{\"text\":\"DataSourceManager\",\"link\":\"/runtime-api/data-source/dataSourceManager\"},{\"text\":\"DataSource\",\"link\":\"/runtime-api/data-source/dataSource\"},{\"text\":\"HttpDataSource\",\"link\":\"/runtime-api/data-source/httpDataSource\"},{\"text\":\"观察者数据类\",\"link\":\"/runtime-api/data-source/observedData\"},{\"text\":\"工具函数\",\"link\":\"/runtime-api/data-source/utils\"}]}]}},\"locales\":{},\"scrollOffset\":134,\"cleanUrls\":false,\"additionalConfig\":{}}");</script>
</body>
</html>