fix: 修复内存泄漏和添加保存按钮加载状态

- router.js: 防止 hashchange 监听器重复绑定
- sidebar.js: 用事件委托替代每次重新绑定事件
- logs.js: 搜索定时器提升为模块级变量,添加 cleanup 导出
- models/agents/gateway/mcp: 保存按钮添加 disabled + 加载文本
This commit is contained in:
晴天
2026-02-26 23:35:33 +08:00
parent 352b85405d
commit c2e3f738b5
7 changed files with 78 additions and 18 deletions

View File

@@ -43,6 +43,8 @@ const ICONS = {
deploy: '<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M22 11.08V12a10 10 0 11-5.93-9.14"/><polyline points="22 4 12 14.01 9 11.01"/></svg>',
}
let _delegated = false
export function renderSidebar(el) {
const current = getCurrentRoute()
@@ -86,14 +88,22 @@ export function renderSidebar(el) {
el.innerHTML = html
// 绑定导航点击事件
el.querySelectorAll('.nav-item[data-route]').forEach(item => {
item.onclick = () => navigate(item.dataset.route)
})
// 主题切换
el.querySelector('#btn-theme-toggle')?.addEventListener('click', () => {
toggleTheme()
renderSidebar(el)
})
// 事件委托:只绑定一次,避免重复绑定
if (!_delegated) {
_delegated = true
el.addEventListener('click', (e) => {
// 导航点击
const navItem = e.target.closest('.nav-item[data-route]')
if (navItem) {
navigate(navItem.dataset.route)
return
}
// 主题切换
const themeBtn = e.target.closest('#btn-theme-toggle')
if (themeBtn) {
toggleTheme()
renderSidebar(el)
}
})
}
}