From: Codebuddy Date: Fri, 21 Aug 2026 12:40:25 +0000 (+0800) Subject: fix(ui): 模型下拉切换无效修复 + 点开下拉实时刷新模型列表 X-Git-Url: http://acesimba.cloud/gitweb/?a=commitdiff_plain;h=8c752ec67685bdcb9b0ffc1ed5ef5fb71af138aa;p=codebuddy-web.git fix(ui): 模型下拉切换无效修复 + 点开下拉实时刷新模型列表 - change 监听器从 showTerminalMode() 内移至脚本初始化区,全局只绑定一次, 避免重复进入终端页导致重复绑定/未绑定,菜单点了没反应 - 新增 focus/mousedown 触发 loadModelSelect(),每次点开下拉实时拉取最新模型列表 --- diff --git a/frontend/index.html b/frontend/index.html index 7e9d2a1..86806b9 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -808,39 +808,43 @@ body { position: fixed; top: 0; left: 0; right: 0; bottom: 0; width: 100%; heigh } // 切换模型:保存到任务,并重启会话以应用 + // 注意:监听器在脚本加载时只绑定一次(见下方初始化区),不放在 showTerminalMode 内, + // 避免重复进入终端页导致重复绑定 / 未绑定,从而引起“点了没反应”。 let modelSwitching = false; - modelSelect.addEventListener('change', async () => { + function onModelChange() { if (modelSwitching || !currentTask) return; const newModel = modelSelect.value; modelSwitching = true; modelSelect.disabled = true; - try { - const res = await fetch(API + '/api/tasks/' + currentTask.id + '/model', { - method: 'POST', - headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders()), - body: JSON.stringify({ model: newModel }) - }); - if (!res.ok) { - const d = await res.json().catch(()=>({})); - alert(d.error || '设置模型失败'); + (async () => { + try { + const res = await fetch(API + '/api/tasks/' + currentTask.id + '/model', { + method: 'POST', + headers: Object.assign({ 'Content-Type': 'application/json' }, authHeaders()), + body: JSON.stringify({ model: newModel }) + }); + if (!res.ok) { + const d = await res.json().catch(()=>({})); + alert(d.error || '设置模型失败'); + modelSelect.value = (currentTask.model) || ''; + return; + } + const data = await res.json(); + currentTask.model = (data.task && data.task.model) || ''; + term.writeln('\x1b[33m⏳ 切换模型为 "' + (currentTask.model || '默认·最新GLM') + '",正在重启会话...\x1b[0m'); + // 重启以应用新模型(resume 同样会采用新 --model) + killCurrent(); + if (term) term.clear(); + connectWS(); + } catch (e) { + alert('设置模型失败: ' + e.message); modelSelect.value = (currentTask.model) || ''; - return; + } finally { + modelSwitching = false; + modelSelect.disabled = false; } - const data = await res.json(); - currentTask.model = (data.task && data.task.model) || ''; - term.writeln('\x1b[33m⏳ 切换模型为 "' + (currentTask.model || '默认·最新GLM') + '",正在重启会话...\x1b[0m'); - // 重启以应用新模型(resume 同样会采用新 --model) - killCurrent(); - if (term) term.clear(); - connectWS(); - } catch (e) { - alert('设置模型失败: ' + e.message); - modelSelect.value = (currentTask.model) || ''; - } finally { - modelSwitching = false; - modelSelect.disabled = false; - } - }); + })(); + } // ========== 终端输入辅助 ========== function sendInput(text) { @@ -1677,6 +1681,13 @@ body { position: fixed; top: 0; left: 0; right: 0; bottom: 0; width: 100%; heigh term.writeln('\x1b[33m⏳ 重启会话中...\x1b[0m'); connectWS(); }; + + // 模型下拉:全局只绑定一次 + // - change:切换模型并重启会话 + // - focus / mousedown:点开下拉时实时刷新模型列表(B 方案,所见即最新) + modelSelect.addEventListener('change', onModelChange); + modelSelect.addEventListener('focus', () => { loadModelSelect(); }); + modelSelect.addEventListener('mousedown', () => { loadModelSelect(); }); document.getElementById('btn-list').onclick = () => { window.open('/', 'cb_picker'); }; document.getElementById('btn-close').onclick = () => { killCurrent();