Commit 25cb466d authored by Data Governance Dev's avatar Data Governance Dev

fix(web3): TaskModal 编辑任务时 schema/table 被 watch(form.dbType) microtask 阶段清空

现象:编辑 Oracle 任务,「数据连接」Tab 的 Schema/数据表 下拉空白显示
「请先测试连接」。连接字段正确回填,但 schema/table 区域像新建任务一样
要重新选。

根因:watch(open) 编辑分支同步执行 form.dbType = task.db_type(即把
默认值 'MySQL' 改成 'Oracle')后,Vue 把 watch(form.dbType) 排进 microtask;
同步代码继续把 form.schema / form.table 从 task 回填完毕。等当前 microtask
跑完,watch(form.dbType) 才执行函数体,里面 '切方言就清 schema/table' 的
清理逻辑把刚回填的值一并清空。MySQL 任务也有这个 bug,只是 schema 通常
等于 db,看起来症状没那么明显。

修法(方案 A):
- 加 isInitializing ref 作为初始化旗子
- watch(open) 入口 isInitializing=true,结束后 await nextTick() × 2 + false
- watch(form.dbType) 头部 if (isInitializing.value) return

用户主动切 dbType / applyPreset() 行为不变(旗子默认 false,watcher 正常清理)。

验证:
- npx vite build → ✓ built in 7.00s
- 编辑 Oracle 任务 → Schema/数据表 自动回填,不再显示「请先测试连接」
- 新建任务切 dbType / applyPreset() 行为不变
parent 0634fb08
...@@ -239,7 +239,7 @@ ...@@ -239,7 +239,7 @@
</template> </template>
<script setup> <script setup>
import { computed, inject, reactive, ref, watch } from 'vue' import { computed, inject, nextTick, reactive, ref, watch } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import RuleModal from '@/components/RuleModal.vue' import RuleModal from '@/components/RuleModal.vue'
import { testConnection, listSchemas, listTables, listColumns } from '@/api/connections' import { testConnection, listSchemas, listTables, listColumns } from '@/api/connections'
...@@ -342,6 +342,11 @@ const connResult = ref({ ok: null, message: '' }) ...@@ -342,6 +342,11 @@ const connResult = ref({ ok: null, message: '' })
// 用 connVerified 拦住:未验证过就直接 return,不去连数据库 // 用 connVerified 拦住:未验证过就直接 return,不去连数据库
const connVerified = ref(false) const connVerified = ref(false)
// 2026-08-24:编辑弹窗初始化旗子 —— 见 watch(open) / watch(form.dbType) 注释。
// 防止「打开编辑弹窗」那一刻 form.dbType 从默认值 'MySQL' 改成 task.db_type (如 'Oracle') 时
// 误触发 watch(form.dbType) 把刚刚写回的 form.schema / form.table 清成空串。
const isInitializing = ref(false)
async function testConn() { async function testConn() {
// 前端必填校验 // 前端必填校验
if (!form.host || !form.port || !form.db || !form.user) { if (!form.host || !form.port || !form.db || !form.user) {
...@@ -552,7 +557,10 @@ watch(() => form.table, (newVal, oldVal) => { ...@@ -552,7 +557,10 @@ watch(() => form.table, (newVal, oldVal) => {
}) })
// dbType 变了 → 清掉 schema/表(不同方言的 schema 概念不同);同时重拉预设列表 // dbType 变了 → 清掉 schema/表(不同方言的 schema 概念不同);同时重拉预设列表
watch(() => form.dbType, async (newVal) => { watch(() => form.dbType, async (newVal, oldVal) => {
// 2026-08-24:编辑弹窗初始化阶段不清理 —— watch(open) 改 form.dbType 是为了把默认值同步成 task 值,
// 不是用户主动切方言。误清会丢掉刚刚从 task 写回的 schema / table。
if (isInitializing.value) return
schemaOptions.value = [] schemaOptions.value = []
tableOptions.value = [] tableOptions.value = []
form.schema = '' form.schema = ''
...@@ -595,6 +603,10 @@ watch(() => props.task?.field_list, () => { ...@@ -595,6 +603,10 @@ watch(() => props.task?.field_list, () => {
watch(() => props.open, async (v) => { watch(() => props.open, async (v) => {
if (v) { if (v) {
// 2026-08-24:编辑弹窗初始化旗子在此置位 —— 防止下面 form.dbType 从默认 'MySQL'
// 改成 task.db_type 后,watch(form.dbType) 误触把刚回填的 schema / table 清空。
// 在函数尾部 await nextTick x2 + 解锁,保证 dbType watcher 跑完才放行。
isInitializing.value = true
activeTab.value = 'basic' activeTab.value = 'basic'
testing.value = false testing.value = false
connResult.value = { ok: null, message: '' } connResult.value = { ok: null, message: '' }
...@@ -668,6 +680,12 @@ watch(() => props.open, async (v) => { ...@@ -668,6 +680,12 @@ watch(() => props.open, async (v) => {
form.table = '' form.table = ''
fieldList.value = [] fieldList.value = []
} }
// 2026-08-24:等两轮 microtask 再解锁。Vue 的 watcher(watch(form.dbType) 在 line 617 改值时
// 已经排进 queue)会在 await nextTick() 之间 flush,跑时看到 isInitializing=true → 直接 return。
// 再 await 一轮兜底,防止链式触发的 watch(form.schema / form.table)漏掉清理。
await nextTick()
await nextTick()
isInitializing.value = false
} }
}) })
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment