fix(strategy): dirty误标根治:Monaco setValue回写modelValue(含换行规整)与nextTick复位竞态;改载入宽限窗口300ms(echoGrace),窗口内code变更不算用户编辑 [nas]
This commit is contained in:
@@ -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
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user