]> acesimba.cloud Git - codebuddy-web.git/commitdiff
fix(ui): 模型下拉切换无效修复 + 点开下拉实时刷新模型列表
authorCodebuddy <codebuddy@localhost>
Fri, 21 Aug 2026 12:40:25 +0000 (20:40 +0800)
committerCodebuddy <codebuddy@localhost>
Fri, 21 Aug 2026 12:40:25 +0000 (20:40 +0800)
- change 监听器从 showTerminalMode() 内移至脚本初始化区,全局只绑定一次,
  避免重复进入终端页导致重复绑定/未绑定,菜单点了没反应
- 新增 focus/mousedown 触发 loadModelSelect(),每次点开下拉实时拉取最新模型列表

frontend/index.html

index 7e9d2a1beb132ea62e5f5b4860cb93e50589e4ae..86806b923e2abcb9fd117161a05727df6751b517 100644 (file)
@@ -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();