fix(strategy): dirty误标根治:Monaco setValue回写modelValue(含换行规整)与nextTick复位竞态;改载入宽限窗口300ms(echoGrace),窗口内code变更不算用户编辑 [nas]
CI/CD / test (push) Successful in 9s
CI/CD / nas-deploy (push) Successful in 23s
CI/CD / nas-verify (push) Successful in 8s

This commit is contained in:
2026-08-13 23:23:13 +08:00
parent f0a0e6bc8a
commit 849e437244
+7 -6
View File
@@ -1,5 +1,5 @@
<script setup lang="ts">
import { ref, computed, onMounted, watch, nextTick } from 'vue'
import { ref, computed, onMounted, watch } from 'vue'
import { useRoute, useRouter } from 'vue-router'
import { ElMessage } from 'element-plus'
import MonacoEditor from '@/components/MonacoEditor.vue'
@@ -52,6 +52,9 @@ onMounted(async () => {
})
const loadingCode = ref(false)
// 载入宽限:载入后 Monaco setValue→onDidChangeModelContent→回写 modelValue 的链路
// 会再次改变 code(可能规整换行),不能当用户编辑;300ms 后才视为真人输入
let echoGrace = false
async function select(f: StrategyFile): Promise<void> {
activeName.value = f.name
@@ -60,14 +63,11 @@ async function select(f: StrategyFile): Promise<void> {
loadingCode.value = true
try {
const { data } = await apiClient.get<{ code: string }>(`/strategy/file/${f.name}`)
echoGrace = true
code.value = data.code
// 程序化赋值会触发 watch(code) 误标 dirty → 渲染后复位
await nextTick()
dirty.value = false
window.setTimeout(() => { echoGrace = false }, 300)
} catch {
code.value = ''
await nextTick()
dirty.value = false
ElMessage.error(`读取 ${f.name} 失败`)
} finally {
loadingCode.value = false
@@ -75,6 +75,7 @@ async function select(f: StrategyFile): Promise<void> {
}
watch(code, () => {
if (echoGrace) return
dirty.value = true
syntaxOk.value = null
})