XNSim/XNSimHtml/components/content-area.js

184 lines
6.4 KiB
JavaScript
Raw Normal View History

2025-04-28 12:25:20 +08:00
class ContentArea extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
this.contentCache = new Map(); // 添加内容缓存Map
}
connectedCallback() {
this.render();
}
render() {
this.shadowRoot.innerHTML = `
<style>
:host {
display: block;
height: 100%;
overflow: auto;
}
.content-container {
height: 100%;
padding: 0 10px; /* 减小左右边距 */
box-sizing: border-box;
}
/* 为不同类型的内容设置不同的样式 */
overview-page {
display: block;
padding: 0 10px;
}
update-history {
display: block;
padding: 0;
}
</style>
<div class="content-container"></div>
`;
}
loadContent(id) {
const container = this.shadowRoot.querySelector('.content-container');
// 先清空容器
container.innerHTML = '';
// 检查是否已有缓存的内容
if (this.contentCache.has(id)) {
try {
// 如果已缓存,直接使用缓存的内容
const cachedContent = this.contentCache.get(id);
// 添加到DOM
container.appendChild(cachedContent);
// 如果组件有重新激活方法,调用它
if (typeof cachedContent.reactivate === 'function') {
// 使用一个短延迟确保DOM已更新后再激活
requestAnimationFrame(() => {
try {
cachedContent.reactivate();
} catch (err) {
console.error(`激活组件 ${id} 时出错:`, err);
}
});
}
} catch (err) {
console.error(`从缓存加载组件 ${id} 时出错:`, err);
// 缓存加载失败,清除缓存并创建新组件
this.clearCache(id);
// 递归调用以创建新组件
this.loadContent(id);
return;
}
return;
}
// 如果没有缓存,创建新的内容
let contentElement;
switch (id) {
case 'overview':
contentElement = document.createElement('overview-page');
break;
case 'update-history':
contentElement = document.createElement('update-history');
break;
case 'run-log':
contentElement = document.createElement('run-log');
break;
case 'system-info':
contentElement = document.createElement('system-info');
break;
case 'help':
contentElement = document.createElement('help-component');
break;
2025-05-07 16:02:39 +08:00
case 'qa':
contentElement = document.createElement('qa-component');
break;
2025-05-16 15:30:54 +08:00
case 'configuration-config':
contentElement = document.createElement('configuration-config');
2025-04-28 12:25:20 +08:00
break;
case 'interface-config':
contentElement = document.createElement('interface-config');
break;
case 'model-development':
contentElement = document.createElement('model-development');
break;
case 'service-development':
contentElement = document.createElement('service-development');
break;
case 'run-test':
contentElement = document.createElement('run-test');
break;
case 'run-simulation':
contentElement = document.createElement('run-simulation');
break;
case 'simulation-monitor':
contentElement = document.createElement('simulation-monitor');
break;
case 'model-monitor':
contentElement = document.createElement('model-monitor');
break;
case 'data-monitor':
contentElement = document.createElement('data-monitor');
break;
case 'data-collection':
contentElement = document.createElement('data-collection');
break;
case 'profile':
contentElement = document.createElement('profile-center');
break;
case 'users':
contentElement = document.createElement('user-management');
break;
2025-05-07 17:01:58 +08:00
case 'system-log':
contentElement = document.createElement('system-log');
break;
2025-05-08 17:01:57 +08:00
case 'todo':
contentElement = document.createElement('todo-component');
break;
2025-04-28 12:25:20 +08:00
default:
contentElement = document.createElement('div');
contentElement.textContent = '正在开发中...';
}
// 添加监听器当内容被移出DOM时通知组件
const observer = new MutationObserver((mutations) => {
mutations.forEach((mutation) => {
if (mutation.type === 'childList' && mutation.removedNodes.length > 0) {
Array.from(mutation.removedNodes).forEach((node) => {
if (node === contentElement && typeof contentElement.isActive === 'boolean') {
contentElement.isActive = false;
}
});
}
});
});
observer.observe(container, { childList: true });
// 缓存内容组件
this.contentCache.set(id, contentElement);
// 添加到容器
container.appendChild(contentElement);
}
// 清除特定标签页的缓存
clearCache(id) {
if (this.contentCache.has(id)) {
this.contentCache.delete(id);
}
}
// 清除所有缓存
clearAllCache() {
this.contentCache.clear();
}
}
customElements.define('content-area', ContentArea);